Experience in using RecyclerView Adapter


Author: Zhuang Superman
 Link: https://www.jianshu.com/p/42254630bdce


Because the development trend has become to use RecyclerView instead of ListVIew, but most of the blog content on the Internet is relatively simple, many uses are not clear, and I have taken many detours in the use process, so I hereby record my experience. First, inherit the parent class

extends RecyclerView.Adapter<RecyclerView.ViewHolder>

You need to implement the following functions

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    return null;
}

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

@Override
public int getItemCount() {
    return 0;
}

onCreateViewHolder() is responsible for creating views for items, and onBindViewHolder() is responsible for binding data to the views of items. Then you need a ViewHolder.

public class MenuItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    private TextView newsType;
    public MenuItemViewHolder(View v) {
        super(v);
        newsType =  (TextView)v.findViewById(R.id.tv_item);
    }

    @Override 
    public void onClick(View v) {
        if (mOnItemClickListener != null) {
            mOnItemClickListener.onItemClick(v, this.getPosition());
        }
    }
}

The above is the basic usage, through which you can use a suggested RecyclerView.
But if the RecyclerView needs to set the view view of multiple items, it needs to set several variables and use this function

private static final int TYPE_TOPIC = 0;
private static final int TYPE_TITLE = 1;

Override
public int getItemViewType(int position) {}

After setting its Type for each item through getItemViewType(), you can create the corresponding view according to the Type in onCreateViewHolder().
If you need to use headerview like ListView, you need to customize a headerview in advance. The example is as follows

private View mHeaderView;
public void setHeaderView(View headerView) {
    mHeaderView =  headerView;
    notifyItemInserted(0);
}

And set it in ViewHolder.

public MainTopicViewHolder (View itemView) {
    super(itemView);
    if (itemView == mHeaderView) return;
    tv_topic = (TextView) itemView.findViewById(R.id.tv_topic);
}

When setting listening, you need to define the interface and set functions in the Adapter

private OnItemClickListener mOnItemClickListener;
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
    this.mOnItemClickListener = onItemClickListener;
}
public interface OnItemClickListener {
    void onItemClick(View view, int position);
}

And bind the listener when onBindViewHolder() is bound

if (mOnItemClickListener != null) {
    ((MainTopicViewHolder) holder).itemView.setOnClickListener(new View.OnClickListener() {
        Override
        public void onClick(View v) {
            int pos = holder.getLayoutPosition();
            mOnItemClickListener.onItemClick(holder.itemView, pos);
        }
    });
}

In the future, if you have other experience on this basis, please add a complete example

public class MainNewsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private static final int TYPE_HEADER = 0;
    private static final int TYPE_TOPIC = 1;
    private static final int TYPE_TITLE = 2;
    private Context mContext;
    private OnItemClickListener mOnItemClickListener;
    private List<StoriesEntity> list;
    private ImageLoader imageLoader;
    private DisplayImageOptions displayImageOptions;
    private View mHeaderView;
    public MainNewsAdapter(Context context) {
        mContext = context;
        list = new ArrayList<>();
        imageLoader = ImageLoader.getInstance();
        displayImageOptions = new DisplayImageOptions.Builder().cacheInMemory(true).cacheOnDisk(true).build();
    }
    public void addList(List<StoriesEntity> items) {
        this.list.addAll(items);notifyDataSetChanged();
    }
    public void setHeaderView(View headerView) {
        mHeaderView = headerView;
        notifyItemInserted(0);
    }
    public View getHeaderView() {
        return mHeaderView;
    }
    public StoriesEntity getItem(int position) {
        return list.get(position-1);
    }
    @Override
    public int getItemViewType(int position) {
        if (position == 0) {
            return TYPE_HEADER;
        } else {
            StoriesEntity entity = list.get(position-1);
            if (entity.getType() == Constant.TOPIC) {
                return TYPE_TOPIC;
            } else {
                return TYPE_TITLE;
            }
        }
    }
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TYPE_TOPIC) {
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_news_topic, parent, false);
            MainTopicViewHolder mainTopicViewHolder = new MainTopicViewHolder(v);
            return mainTopicViewHolder;
        } else if (viewType == TYPE_TITLE) {
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_news_item, parent, false);
            MainNewsViewHolder mainNewsViewHolder = new MainNewsViewHolder(v);
            return mainNewsViewHolder;
        } else {
            MainTopicViewHolder mainTopicViewHolder = new MainTopicViewHolder(mHeaderView);
            return mainTopicViewHolder;
        }
    }
    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
        if (position == 0) {
            return;
        }
        if (holder instanceof MainNewsViewHolder) {
            StoriesEntity entity = list.get(position — 1);
            ((MainNewsViewHolder) holder).tv_title.setText(entity.getTitle());
            imageLoader.displayImage(entity.getImages().get(0),((MainNewsViewHolder) holder).iv_title, displayImageOptions);
            if (mOnItemClickListener != null) {
                ((MainNewsViewHolder) holder).itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        int pos = holder.getLayoutPosition();
                        mOnItemClickListener.onItemClick(holder.itemView, pos);
                    }
                 });
            }
        } else {
            StoriesEntity entity = list.get(position-1);          
            ((MainTopicViewHolder) holder).tv_topic.setVisibility(View.VISIBLE);((MainTopicViewHolder) holder).tv_topic.setText(entity.getTitle());
            if (mOnItemClickListener != null) {
                ((MainTopicViewHolder) holder).itemView.setOnClickListener(new View.OnClickListener()     
                    @Override
                    public void onClick(View v) {
                        int pos = holder.getLayoutPosition();
                        mOnItemClickListener.onItemClick(holder.itemView, pos);
                    }
                });
            }
        }
    }
    @Override
    public int getItemCount() {
        return mHeaderView == null ? list.size() : list.size() + 1;
    }
    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.mOnItemClickListener = onItemClickListener;
    }
    public interface OnItemClickListener {
        void onItemClick(View view, int position);
    }
    public class MainTopicViewHolder extends RecyclerView.ViewHolder {
        TextView tv_topic;
        public MainTopicViewHolder(View itemView) {
            super(itemView);
            if (itemView == mHeaderView) return;
            tv_topic = (TextView) itemView.findViewById(R.id.tv_topic);
        }
    }
    public class MainNewsViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView tv_title;
        ImageView iv_title;
        public MainNewsViewHolder(View itemView) {          
            super(itemView);
            tv_title = (TextView) itemView.findViewById(R.id.tv_title);
            iv_title = (ImageView) itemView.findViewById(R.id.iv_title);}
            @Override
            public void onClick(View v) {
                if (mOnItemClickListener != null) {
                    mOnItemClickListener.onItemClick(v, this.getPosition());
                }
            }
    }
}

Posted by witt on Mon, 30 Mar 2020 12:27:45 -0700