动态创建RecyclerView UI - Android

时间:2016-03-01 06:43:50

标签: android listview android-recyclerview

我正在开发电子商务应用。我正在处理产品过滤。 这里的过滤器是动态的,这意味着一旦过滤页面显示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会多次创建相同的过滤器。     我想知道如何管理上面的代码,以便我可以消除这个问题。

1 个答案:

答案 0 :(得分:1)

您需要了解ViewHolders是什么。具体类型的ViewHolder具有单一布局。如果可以考虑创建不同的视图持有者类型,或者具有预定义布局的视图,这将在onBind回调中自定义。你看到的情况正在发生,因为RecyclerView重用了视图,只调用onCreateViewHolder来填充屏幕上的项目,然后重复使用它们。