我正在使用带有自定义适配器的RecyclerView,它扩展了RecyclerView.Adapter
我在运行时使用Textview创建LinearLayout并在RecyclerView的每一行中对其进行充气
例如,RecyclerView的第1行将在运行时创建2或3个Textview,第2行将在运行时创建2或3个Textview,第3行将具有一些Textviews ...依此类推......
如果我检查我的日志,它的工作几乎完美...但是当我向下滚动它时,它只是将一些textview放在错误的位置,这意味着当我在错误的位置向下滚动时我再次获得Textviews
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
//Movie movie = mItems.get(i);
hm2 = new HashMap<String, ArrayList<PD_Data>>();
sub_rows2 = new ArrayList<PD_Data>();
hm2=categories.get(i);
String key=hm2.keySet().toArray()[0].toString();
sub_rows2=hm2.get(key);
Log.i(LOG_TKT,key);
viewHolder.textview_category.setText(key);
LayoutInflater inflater;
View new_sub_row;
for(int x=0;x<sub_rows2.size();x++){
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
new_sub_row = inflater.inflate(R.layout.recyclerview_pd, null);
TextView heading2 = (TextView)new_sub_row.findViewById(R.id.heading2);
heading2.setText(sub_rows2.get(x).sub_heading);
Log.i(LOG_TKT,sub_rows2.get(x).sub_heading);
TextView detail2 = (TextView)new_sub_row.findViewById(R.id.detail2);
detail2.setText(sub_rows2.get(x).value);
Log.i(LOG_TKT, sub_rows2.get(x).value);
viewHolder.linearlayout_recyclerview_pd.addView(new_sub_row);
}
//viewHolder.imgThumbnail.setImageResource(movie.getThumbnail());
hm2 = new HashMap<String, ArrayList<PD_Data>>();
sub_rows2 = new ArrayList<PD_Data>();
}
我做错了什么?
答案 0 :(得分:2)
从您的问题中可以明显看出,您对如何使用RecyclerViews并不熟悉。你需要阅读这个主题。 Here是一个好的开始。
基本上,绑定 ViewHolder()仅负责将您的数据绑定到viewHolders,其中包含您通过onCreateViewHolder()
提供的项目布局。原因是RecyclerView 回收您的视图,因此每次滚动时都不必创建新视图。
在您的情况下,您似乎需要使用一些技术来告诉RecyclerView对不同的项目使用不同的viewHolders。了解如何执行此操作here。
答案 1 :(得分:1)
我已经回答了在另一个问题中更好地使用ViewHolder绑定数据的做法。你可以在这里查看RecyclerView causes issue when recycling我希望这对你有帮助。这将很好地解决您的问题。 修改的
你解决了问题了吗?如果没有,请考虑我的建议。你知道问题对吗?假设您为项目0创建ViewHOlder并在其中添加一些文本。在滚动时,假设此ViewHolder为项目编号10回收,那么根据您的代码,它将添加新文本行以及为项目编号0添加的一些文本行。您可以像
一样解决它LayoutInflater inflater;
View new_sub_row;
//check here if the linear layout already has previusely added child, if yes remove them
if(viewHolder.linearlayout_recyclerview_pd.getChildCount()>0){
viewHolder.linearlayout_recyclerview_pd.removeAllViews();
}
for(int x=0;x<sub_rows2.size();x++){
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
new_sub_row = inflater.inflate(R.layout.recyclerview_pd, null);
TextView heading2 = (TextView)new_sub_row.findViewById(R.id.heading2);
heading2.setText(sub_rows2.get(x).sub_heading);
Log.i(LOG_TKT,sub_rows2.get(x).sub_heading);
TextView detail2 = (TextView)new_sub_row.findViewById(R.id.detail2);
detail2.setText(sub_rows2.get(x).value);
Log.i(LOG_TKT, sub_rows2.get(x).value);
viewHolder.linearlayout_recyclerview_pd.addView(new_sub_row);
}