前言
这个问题很早之前就碰到过,后来通过google找到了解决办法,也就没有去管它了,直到最近有朋友问到这个问题,感觉很熟悉却又说不出具体原因,因此,就想通过源码分析一下。顺便做个总结,避免以后出现类似的问题。
问题复现
为什么发现了这个问题呢?是当时要写一个列表,列表本来很简单,一行显示一个文本,实现起来也很容易,一个RecyclerView就搞定。
Activity以及Adapter代码如下:
private void initView() {
mRecyclerView = (RecyclerView) findViewById(R.id.rv_inflate_test);
RVAdapter adapter = new RVAdapter();
adapter.setData(mockData());
LinearLayoutManager manager = new LinearLayoutManager(this);
manager.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
mRecyclerView.setLayoutManager(manager);
mRecyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
private List<String> mockData(){
List<String> datas = new ArrayList<>();
for(int i=0;i<100;i++){
datas.add("这是第"+i+ "个item ");
}
return datas;
}
public static class RVAdapter extends RecyclerView.Adapter{
private List<String> mData;
public void setData(List<String> data) {
mData = data;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new InflateViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.inflate_test_item,null));
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
InflateViewHolder viewHolder = (InflateViewHolder) holder;
((InflateViewHolder) holder).mTextView.setText(mData.get(position));
}
@Override
public int getItemCount() {
return mData == null ? 0:mData.size();
}
public static class InflateViewHolder extends RecyclerView.ViewHolder{
private TextView mTextView;
public InflateViewHolder(View itemView) {
super(itemView);
mTextView = (TextView) itemView.findViewById(R.id.text_item);
}
}
}
然后RecyclerView的item布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=