游.程 2014-10-07 20:55 采纳率: 0%
浏览 260
已采纳

如何创建多视图类型的 RecyclerView?

From https://developer.android.com/preview/material/ui-widgets.html

When we create RecyclerView.Adapter we have to specify ViewHolder that will bind with the adapter.

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private String[] mDataset;

    public MyAdapter(String[] myDataset) {
        mDataset = myDataset;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public TextView mTextView;
        public ViewHolder(TextView v) {
            super(v);
            mTextView = v;
        }
    }

    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.some_layout, parent, false);

        //findViewById...

        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.mTextView.setText(mDataset[position]);
    }

    @Override
    public int getItemCount() {
        return mDataset.length;
    }
}

So, is it possible to create RecyclerView with multiple view types?

转载于:https://stackoverflow.com/questions/26245139/how-to-create-recyclerview-with-multiple-view-type

  • 写回答

7条回答 默认 最新

  • 10.24 2014-10-07 21:17
    关注

    Yes, it's possible. Just implement getItemViewType(), and take care of the viewType parameter in onCreateViewHolder().

    So you do something like:

    public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
        class ViewHolder0 extends RecyclerView.ViewHolder {
            ...
            public ViewHolder0(View itemView){
            ...
            }
        }
    
        class ViewHolder2 extends RecyclerView.ViewHolder {
            ...
            public ViewHolder2(View itemView){
            ...
        }
    
        @Override
        public int getItemViewType(int position) {
            // Just as an example, return 0 or 2 depending on position
            // Note that unlike in ListView adapters, types don't have to be contiguous
            return position % 2 * 2;
        }
    
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
             switch (viewType) {
                 case 0: return new ViewHolder0(...);
                 case 2: return new ViewHolder2(...);
                 ...
             }
        }
    
        @Override
        public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
            switch (holder.getItemViewType()) {
                case 0:
                    ViewHolder0 viewHolder0 = (ViewHolder0)holder;
                    ...
                    break;
    
                case 2:
                    ViewHolder2 viewHolder2 = (ViewHolder2)holder;
                    ...
                    break;
            }
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 flink cdc无法实时同步mysql数据
  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名