使用RecyclerView自定義實現二級聯動列表

一、需求分析

單各list列表實現很簡單直接使用RecyclerView填充列表即可,那麼多級列表該怎樣實現呢,同樣很簡單,只需監聽第一級列表的item點擊事件再填充第二級列表即可實現。

二、代碼實現

1、創建佈局文件

由兩個RecyclerView填充佈局,左右分佈

<?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="match_parent"
    android:orientation="horizontal">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_recyclerview_one"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:padding="10dp">

    </android.support.v7.widget.RecyclerView>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_recyclerview_two"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2"
        android:padding="10dp"
        >

    </android.support.v7.widget.RecyclerView>
</LinearLayout>
2、主Activity代碼

由於註釋寫的很清楚,直接貼代碼給大家看了

/**
 * 多列list
 * @author petergee
 * @date 2018/7/26
 */
public class MultiColumnListActivity extends Activity {

    private List<String> list;
    private List<String> list2;
    private List<String> list3;
    private List<String> list4;
    private FirstLineAdapter firstLineAdapter,secondLineAdapter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_multi_column);
        initData();
        initView();
    }

    private void initData() {
        list = new ArrayList<>();
        list.add("于謙");
        list.add("郭德綱");
        list.add("小嶽嶽");


        list2 = new ArrayList<>();
        list2.add("抽菸");
        list2.add("喝酒");
        list2.add("燙頭");


        list3 = new ArrayList<>();
        list3.add("主持");
        list3.add("說相聲");
        list3.add("拍電影");


        list4 = new ArrayList<>();
        list4.add("拍電影");
        list4.add("唱歌");
        list4.add("說相聲");
        list4.add("做採訪");


    }

    private void initView() {
        RecyclerView recyclerView=findViewById(R.id.rv_recyclerview_one);
        final RecyclerView recyclerViewTwo=findViewById(R.id.rv_recyclerview_two);
        // layoutManager
        LinearLayoutManager layoutManager=new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        // set layoutManager
        recyclerView.setLayoutManager(layoutManager);
        recyclerViewTwo.setLayoutManager(new LinearLayoutManager(this));
        // item Decoration
        DividerItemDecoration dividerItemDecoration=new DividerItemDecoration(this,DividerItemDecoration.VERTICAL);
        dividerItemDecoration.setDrawable(getResources().getDrawable(R.drawable.divider_line));
        recyclerView.addItemDecoration(dividerItemDecoration);
        recyclerViewTwo.addItemDecoration(dividerItemDecoration);
        // item Animator
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerViewTwo.setItemAnimator(new DefaultItemAnimator());
        // adapter
        firstLineAdapter = new FirstLineAdapter(this,list);
        secondLineAdapter = new FirstLineAdapter(this,list2);
        recyclerView.setAdapter(firstLineAdapter);
        // childAdapter
        recyclerViewTwo.setAdapter(secondLineAdapter);
        // add listener
        firstLineAdapter.setRecyclerItemClickListener(new RecyclerItemClickListener() {
            @Override
            public void onItemClickListener(int position) {
                if (position==0){
                    secondLineAdapter=new FirstLineAdapter(getApplicationContext(),list2);
                    recyclerViewTwo.setAdapter(secondLineAdapter);
                }

                if (position==1){
                    secondLineAdapter=new FirstLineAdapter(getApplicationContext(),list3);
                    recyclerViewTwo.setAdapter(secondLineAdapter);
                }

                if (position==2){
                    secondLineAdapter=new FirstLineAdapter(getApplicationContext(),list4);
                    recyclerViewTwo.setAdapter(secondLineAdapter);
                }
            }

            @Override
            public void onItemLongClickListener(int position) {
                Toast.makeText(getApplicationContext(),"LongClicked "+list.get(position),Toast.LENGTH_SHORT).show();
            }
        });

    }
}
3、Adapter實現

由於需要使用ietm的點擊事件,添加了接口,進行回調實現

/**
 * @author petergee
 * @date 2018/7/27
 */
public class FirstLineAdapter extends RecyclerView.Adapter<viewHolder> {
    private Context mContext;
    private List<String> mList;
    public RecyclerItemClickListener recyclerItemClickListener;

    public FirstLineAdapter(Context context, List<String> list) {
        this.mContext = context;
        this.mList = list;
    }

    @NonNull
    @Override
    public viewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(mContext).inflate(R.layout.item_multi_column_list,parent,false);
        return new viewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull viewHolder holder, final int position) {
        String str=mList.get(position);
        holder.tvTextFirstLine.setText(str);

        //item listener
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (recyclerItemClickListener==null){
                    return;
                }
                recyclerItemClickListener.onItemClickListener(position);
            }
        });

        // item LongClickListener
        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                if (recyclerItemClickListener!=null)
                recyclerItemClickListener.onItemLongClickListener(position);
                return false;
            }
        });
    }

    @Override
    public int getItemCount() {
        return mList.size()==0?0:mList.size();
    }


    public void setRecyclerItemClickListener(RecyclerItemClickListener recyclerItemClickListener) {
        this.recyclerItemClickListener = recyclerItemClickListener;
    }
}

class viewHolder extends RecyclerView.ViewHolder {
    TextView tvTextFirstLine;
    public viewHolder(View itemView) {
        super(itemView);
        tvTextFirstLine=itemView.findViewById(R.id.item_text);
    }
}
4、接口

添加了條目點擊和長按事件監聽回調方法

public interface RecyclerItemClickListener{
    void onItemClickListener(int position);
    void onItemLongClickListener(int position);
}
5、Adapter中item佈局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
<TextView
    android:id="@+id/item_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="16sp"
    android:textColor="@color/color_black"
    android:layout_centerHorizontal="true"
    android:layout_margin="5dp"
    />
</RelativeLayout>

三、效果圖

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章