前言
这个问题很早之前就碰到过,后来通过google找到了解决办法,也就没有去管它了,直到最近有朋友问到这个问题,感觉很熟悉却又说不出具体原因,因此,就想通过源码分析一下。顺便做个总结,避免以后出现类似的问题。
封面.png
问题复现
为什么发现了这个问题呢?是当时要写一个列表,列表本来很简单,一行显示一个文本,实现起来也很容易,一个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 mockData(){
List 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 mData;
public void setData(List 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布局文件如下:
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:id="@+id/text_item"
android:layout_width="match_parent"
android:layout_height="50dp"
android:textSize="18sp"
android:textColor="@android:color/white"
android:background="#AA47BC"
android:gravity="center"
/>
代码很简单,就是一个RecyclerView 显示一个简单的列表,一行显示一个文本。写完代码运行看一下效果: