recycleview实现多种布局及点击事件

来源:互联网 发布:高斯分布和协方差矩阵 编辑:程序博客网 时间:2024/05/16 17:39


1.导入design包

2.MainActivitiy类,FullLinearlayoutManager类,Adapter

3.layout里面的布局

package com.example.recycleview;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.RecyclerView;import android.view.View;import android.widget.Toast;import java.util.ArrayList;import java.util.List; /* * recycleview实现分布式布局 * 此处以三种不同的list实现三种不同的布局 * Created by y.vn on 2016/12/21. */public class MainActivity extends AppCompatActivity {    private RecyclerView recyclerView;    private List<String> firstList = new ArrayList<>();    private List<String> secondList = new ArrayList<>();    private List<String> thirdList = new ArrayList<>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        recyclerView = (RecyclerView) findViewById(R.id.recycleview);        //控制recycleview高度自适应        recyclerView.setLayoutManager(new FullLinearLayoutManager(this));        initDate();        RecycleViewAdapter recycleViewAdapter = new RecycleViewAdapter(this, firstList, secondList, thirdList);        recyclerView.setAdapter(recycleViewAdapter);        //adapter的点击事件        recycleViewAdapter.setOnItemListener(new RecycleViewAdapter.OnItemListener() {            @Override            public void onClick(View v, int position) {                Toast.makeText(MainActivity.this, position + "", Toast.LENGTH_SHORT);            }        });    }    //初始化list数据源    private void initDate() {        for (int i = 0; i < 5; i++) {            firstList.add("第一种布局" + i);        }        for (int i = 5; i < 10; i++) {            secondList.add("第二种布局" + i);        }        for (int i = 10; i < 16; i++) {            thirdList.add("第三种布局" + i);        }    }}
import android.content.Context;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.View;import android.view.ViewGroup;/** * Created by y.vn on 2016/11/30. */public class FullLinearLayoutManager extends LinearLayoutManager {    private static final String TAG = FullLinearLayoutManager.class.getSimpleName();    public FullLinearLayoutManager(Context context) {        super(context);    }    public FullLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {        super(context, orientation, reverseLayout);    }    private int[] mMeasuredDimension = new int[2];    @Override    public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state,                          int widthSpec, int heightSpec) {        final int widthMode = View.MeasureSpec.getMode(widthSpec);        final int heightMode = View.MeasureSpec.getMode(heightSpec);        final int widthSize = View.MeasureSpec.getSize(widthSpec);        final int heightSize = View.MeasureSpec.getSize(heightSpec);        int width = 0;        int height = 0;        for (int i = 0; i < getItemCount(); i++) {            measureScrapChild(recycler, i,                    View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),                    View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),                    mMeasuredDimension);            if (getOrientation() == HORIZONTAL) {                width = width + mMeasuredDimension[0];                if (i == 0) {                    height = mMeasuredDimension[1];                }            } else {                height = height + mMeasuredDimension[1];                if (i == 0) {                    width = mMeasuredDimension[0];                }            }        }        switch (widthMode) {            case View.MeasureSpec.EXACTLY:                width = widthSize;            case View.MeasureSpec.AT_MOST:            case View.MeasureSpec.UNSPECIFIED:        }        switch (heightMode) {            case View.MeasureSpec.EXACTLY:                height = heightSize;            case View.MeasureSpec.AT_MOST:            case View.MeasureSpec.UNSPECIFIED:        }        setMeasuredDimension(width, height);    }    private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,                                   int heightSpec, int[] measuredDimension) {        try {            View view = recycler.getViewForPosition(0);//fix 动态添加时报IndexOutOfBoundsException            if (view != null) {                RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();                int childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec,                        getPaddingLeft() + getPaddingRight(), p.width);                int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec,                        getPaddingTop() + getPaddingBottom(), p.height);                view.measure(childWidthSpec, childHeightSpec);                measuredDimension[0] = view.getMeasuredWidth() + p.leftMargin + p.rightMargin;                measuredDimension[1] = view.getMeasuredHeight() + p.bottomMargin + p.topMargin;                recycler.recycleView(view);            }        } catch (Exception e) {            e.printStackTrace();        }    }}

import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import java.util.List;/** * Created by y.vn on 2016/12/21. */public class RecycleViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {    private Context context;    private List<String> firstList;    private List<String> secondList;    private List<String> thirdList;    private OnItemListener listener;    public RecycleViewAdapter(Context context, List<String> firstList, List<String> secondList, List<String> thirdList) {        this.context = context;        this.firstList = firstList;        this.secondList = secondList;        this.thirdList = thirdList;    }    public void setOnItemListener(OnItemListener onItemListener) {        this.listener = onItemListener;    }    public interface OnItemListener {        //此处可以选择我们需要的参数例如position.        void onClick(View v, int position);    }    @Override    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        RecyclerView.ViewHolder holder = null;        switch (viewType) {            case 0:                holder = new MySignHolder1(LayoutInflater.from(context).inflate(R.layout.item_list, parent, false));                break;            case 1:                holder = new MySignHolder2(LayoutInflater.from(context).inflate(R.layout.item_list, parent, false));                break;            case 2:                holder = new MySignHolder3(LayoutInflater.from(context).inflate(R.layout.item_list, parent, false));                break;        }        return holder;    }    @Override    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {        if (holder instanceof MySignHolder1 && firstList.size() != 0) {            MySignHolder1 md1 = (MySignHolder1) holder;            if (position == 0) {                md1.list_title.setVisibility(View.VISIBLE);                md1.list_title.setText("第一种布局");            }            if (position == firstList.size() - 1) {                md1.list_line.setVisibility(View.GONE);            }            md1.list_text.setText(firstList.get(position));        } else if (holder instanceof MySignHolder2 && secondList.size() != 0) {            MySignHolder2 md2 = (MySignHolder2) holder;            int position2 = position - firstList.size();            if (position2 == 0) {                md2.list_title.setVisibility(View.VISIBLE);                md2.list_title.setText("第二种布局");            }            if (position2 == secondList.size() - 1) {                md2.list_line.setVisibility(View.GONE);            }            md2.list_text.setText(secondList.get(position2));        } else if (holder instanceof MySignHolder3 && thirdList.size() != 0) {            MySignHolder3 md3 = (MySignHolder3) holder;            int position3 = position - (firstList.size() + secondList.size());            if (position3 == 0) {                md3.list_title.setVisibility(View.VISIBLE);                md3.list_title.setText("第三种布局");            }            if (position3 == thirdList.size() - 1) {                md3.list_line.setVisibility(View.GONE);            }            md3.list_text.setText(thirdList.get(position3));        }    }    @Override    public int getItemCount() {        return firstList.size() + secondList.size() + thirdList.size();    }    //当前的列表布局中有几种不同的分类,那么就在数组中定义n个不重复的数字    int[] type = {0, 1, 2};    @Override    public int getItemViewType(int position) {        if (position >= 0 && position < firstList.size()) {            return type[0];        } else if (position >= firstList.size() && position < firstList.size() + secondList.size()) {            return type[1];        } else {            return type[2];        }    }    private class MySignHolder1 extends RecyclerView.ViewHolder {        TextView list_title, list_text, list_line;        public MySignHolder1(View itemView) {            super(itemView);            list_title = (TextView) itemView.findViewById(R.id.list_title);            list_text = (TextView) itemView.findViewById(R.id.list_text);            list_line = (TextView) itemView.findViewById(R.id.list_line);            itemView.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    if (listener != null) {                        listener.onClick(v, getLayoutPosition());                    }                }            });        }    }    private class MySignHolder2 extends RecyclerView.ViewHolder {        TextView list_title, list_text, list_line;        public MySignHolder2(View itemView) {            super(itemView);            list_title = (TextView) itemView.findViewById(R.id.list_title);            list_text = (TextView) itemView.findViewById(R.id.list_text);            list_line = (TextView) itemView.findViewById(R.id.list_line);            itemView.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    if (listener != null) {                        listener.onClick(v, getLayoutPosition());                    }                }            });        }    }    private class MySignHolder3 extends RecyclerView.ViewHolder {        TextView list_title, list_text, list_line;        public MySignHolder3(View itemView) {            super(itemView);            list_title = (TextView) itemView.findViewById(R.id.list_title);            list_text = (TextView) itemView.findViewById(R.id.list_text);            list_line = (TextView) itemView.findViewById(R.id.list_line);            itemView.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    if (listener != null) {                        listener.onClick(v, getLayoutPosition());                    }                }            });        }    }}

布局

main 里面

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_main"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.example.recycleview.MainActivity">    <android.support.v7.widget.RecyclerView        android:id="@+id/recycleview"        android:layout_width="match_parent"        android:layout_height="match_parent" /></RelativeLayout>
item 
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:orientation="vertical">    <TextView        android:id="@+id/list_title"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:gravity="center_horizontal"        android:padding="@dimen/text_10dp"        android:text="第一种布局"        android:textColor="@color/colorPrimaryDark"        android:textSize="@dimen/text_20dp"        android:visibility="gone"/>    <TextView        android:id="@+id/list_text"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:padding="@dimen/text_10dp"        android:textSize="@dimen/text_10dp" />    <TextView        android:id="@+id/list_line"        android:layout_width="match_parent"        android:layout_height="1dp"        android:background="@color/gray" /></LinearLayout>



0 0
原创粉丝点击