我正在开发电子商务应用。我正在处理产品过滤。 这里的过滤器是动态的,这意味着一旦过滤页面显示BRANDS和PRICE,那么下次它可以显示BRANDS,PRICE,STYLES ..等等。 过滤产品可能有很多种情况。
应用程序正在从Webservice动态接收过滤器。 所以我在这里使用从webservice收到的数据动态创建过滤器。为此,我使用RecyclerView来显示动态过滤器
以下是我在动态创建过滤器的RecyclerView代码。
onCreateViewHolder():
@Override
public FilterViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LinearLayout topLayout = new LinearLayout(mContext);
topLayout.setOrientation(LinearLayout.VERTICAL);
if (filterItems != null) {
for (int filterItemsCount = 0; filterItemsCount < filterItems.size(); filterItemsCount++) {
LinearLayout ll = new LinearLayout(mContext);
ll.setOrientation(LinearLayout.VERTICAL);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(10, 10, 10, 10);
AFileterItem filterItem = filterItems.get(filterItemsCount);
TextView textView = new TextView(mContext);
textView.setText(filterItem.getFiletrLabel());
ll.addView(textView);
for (int i = 0; i < filterItem.getList().size(); i++) {
VlauesItem item1 = filterItem.getList().get(i);
CheckBox cb = new CheckBox(mContext);
cb.setId(i);
cb.setText(item1.getValueItemLabel());
cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Toast.makeText(mContext, String.valueOf(isChecked), Toast.LENGTH_SHORT).show();
}
});
ll.addView(cb);
}
topLayout.addView(ll);
}
}else{
topLayout.addView(null);
}
FilterViewHolder viewHolder = new FilterViewHolder(topLayout);
return viewHolder;
}
现在,问题是:
当我动态创建过滤器时,RecyclerView会多次创建相同的过滤器。 我想知道如何管理上面的代码,以便我可以消除这个问题。
答案 0 :(得分:1)
您需要了解ViewHolders是什么。具体类型的ViewHolder具有单一布局。如果可以考虑创建不同的视图持有者类型,或者具有预定义布局的视图,这将在onBind回调中自定义。你看到的情况正在发生,因为RecyclerView重用了视图,只调用onCreateViewHolder来填充屏幕上的项目,然后重复使用它们。