以下示例为搭建一个表格形式的列表。里面的 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;        }    }}

布局文件示例:

<?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="match_parent">    <TextView        android:id="@+id/text_a"        android:layout_width="wrap_content"        android:layout_height="wrap_content" />RelativeLayout>
<?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="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);    }

更多相关文章

  1. 曾经的笔记——android的学习笔记(布局和电话、短信权限)
  2. GitHub 优秀的 Android(安卓)开源项目
  3. Android四大组件之activity之间带数据跳转
  4. Android(安卓)使用BroadCast实现强制下线功能
  5. Android(安卓)之 五大布局案例
  6. 【转】 Array ,Simple ,SimpleCursor Adapter 区别
  7. Drawer实现左右侧滑DrawerLayout
  8. Android(安卓)CardView+RecyclerView实现卡片列表
  9. Android(安卓)pulltorefresh上拉下拉刷新加载

随机推荐

  1. Android(安卓)Widget 小工具(两) 使用con
  2. Mono for Android(安卓)设计器错误:Discon
  3. Android(安卓)CTS 测试研究之二
  4. android 7.0系统解决拍照的问题android.o
  5. 使用Javaweb开发的WebService部署到Tomca
  6. Android(安卓)复制和粘贴功能
  7. Android模拟用户点击的实现方法
  8. Android(安卓)经验: 本地 5555 端口会被
  9. android api包简要介绍
  10. Android(安卓)Studio打包以及签名