【面包屑】快速使用RecyclerView搭建列表

以下示例为搭建一个表格形式的列表。里面的 item 可以设置占用不同的列数。

Adapter示例:

public class SampleRecyclerViewAdapter extends RecyclerView.Adapter {
    public enum ItemType{
        TYPE_A,
        TYPE_B,
    }

    private List mDataSet;
    private Context mContext;

    public SampleRecyclerViewAdapter(Context context, List dataSet) {
        mDataSet = dataSet;
        mContext = context;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        /**
         * 不同类型卡片需要不同类型布局的话,在这设置
         */
        if (ItemType.TYPE_A.ordinal() == viewType) {
            View v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.layout_a, parent, false);
            RecyclerView.ViewHolder vh = new AViewHolder(v);
            return vh;
        } else if (ItemType.TYPE_B.ordinal() == viewType) {
            View v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.layout_b, parent, false);
            RecyclerView.ViewHolder vh = new BViewHolder(v);
            return vh;
        }
        return null;
    }

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);

        /**
         * 根据需要调整单个卡片所占列数
         */
        RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
        if(manager instanceof GridLayoutManager) {
            final GridLayoutManager gridManager = ((GridLayoutManager) manager);
            gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                @Override
                public int getSpanSize(int position) {
                    if (ItemType.TYPE_A == mDataSet.get(position).mType) {
                        //占一列
                        return 1;
                    } else if (ItemType.TYPE_B == mDataSet.get(position).mType) {
                        //占两列
                        return 2;
                    }
                    return 1;
                }
            });
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {

        DataItem item = mDataSet.get(position);
        /**
         * 不同布局的 item 需要不同的 ViewHolder
         */
        if (ItemType.TYPE_A == item.mType) {
            AViewHolder aViewHolder = (AViewHolder) viewHolder;
            aViewHolder.tv.setText(item.a);
        } else if(ItemType.TYPE_B == item.mType) {
            BViewHolder bViewHolder = (BViewHolder) viewHolder;
            bViewHolder.iv.setImageDrawable(item.b);

        }
    }

    @Override
    public int getItemViewType(int position) {
        /**
         * 如果有多种类型的卡片,需要在这里给定卡片的类型的判断规则
         */
        return mDataSet.get(position).mType.ordinal() ;
    }

    @Override
    public int getItemCount() {
        return mDataSet.size();
    }

    /**
     * APP 类型卡片的ViewHolder
     */
    private static class AViewHolder extends RecyclerView.ViewHolder {

        TextView tv;
        public AViewHolder(View itemView) {
            super(itemView);
            tv = (TextView) itemView.findViewById(R.id.text_a);
        }
    }

    /**
     * 主卡片的 ViewHolder
     */
    private class BViewHolder extends RecyclerView.ViewHolder {
        ImageView iv;
        public BViewHolder(View itemView) {
            super(itemView);
            iv = (ImageView) itemView.findViewById(R.id.image_b);
        }
    }

    /**
     * 各个卡片单元的基础数据对象
     */
    public static class DataItem{
        SampleRecyclerViewAdapter.ItemType mType;

        String a;
        Drawable b;

        public void setType(SampleRecyclerViewAdapter.ItemType type) {
            mType = type;
        }

        public void setA(String s) {
            a = s;
        }

        public void setB(Drawable d) {
            b = d;
        }

    }
}

布局文件示例:


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">
    <TextView
        android:id="@+id/text_a"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
RelativeLayout>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <ImageView
        android:id="@+id/image_b"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
RelativeLayout>

最终调用方法示例

private void test() {
        List dataset = new ArrayList<>();
        SampleRecyclerViewAdapter.DataItem a = new SampleRecyclerViewAdapter.DataItem();
        a.setA("test");
        SampleRecyclerViewAdapter.DataItem b = new SampleRecyclerViewAdapter.DataItem();
        b.setB(getResources().getDrawable(R.drawable.ic_launcher));
        dataset.add(a);
        dataset.add(b);

        mRecyclerView = (RecyclerView) findViewById(R.id.sample_recycler_view);
        mRecyclerView.setHasFixedSize(true);
        // 使用表格布局管理器,并设置列数为2。用于演示不同类型item可以占用不同的列数
        mLayoutManager = new GridLayoutManager(
                mRecyclerView.getContext(),
                2,
                GridLayoutManager.VERTICAL,
                false);
        mRecyclerView.setLayoutManager(mLayoutManager);

        mAdapter = new SampleRecyclerViewAdapter(this, dataset);
        mRecyclerView.setAdapter(mAdapter);
    }

你可能感兴趣的:(android,面包屑,recyclerview,android)