Dynamically adding Views in a RecyclerView only to current item

前端 未结 8 1963
一向
一向 2020-12-20 12:08

I\'m dynamically adding Views to my items in a RecyclerView. These added Views should only be related to the item which they\'re added to, but I\'m having a pro

相关标签:
8条回答
  • 2020-12-20 12:42

    You can use this! setItemViewCacheSize(int size) Check here RecyclerViewDocumentation.

    The offscreen view cache stays aware of changes in the attached adapter, allowing a LayoutManager to reuse those views unmodified without needing to return to the adapter to rebind them.

    0 讨论(0)
  • 2020-12-20 12:42

    You should take any Empty Layout like Linearlayout in your child item layout XML and then add views into that LinearLayout of your particular item in this way when you scroll List all of you child views which you have added to LinearLayout also scroll with that item .

    0 讨论(0)
  • 2020-12-20 12:48

    Save Information by tags for items with new child each time the Add newView operation occur. (In shared preference for example) Tag: create with item position onBindViewHolder.

    ...
    SharedPreference  sharedPref = getSharedPreference("text" + position, context);
    SharedPreference.Editor editor = sharedPref.edit();
    editor.putString("view", "ImageView");
    ...
    

    when load Adapter get this value and put default as null. I am not sure about its efficiency but i will work.

    ...
    String viewType = sharedPref.getString("view", null);
    //it will return ImageView 
    

    if you know some possible viewTypes for example always going to be ImageView & TextView so with some if statement it will be ok.

    if(viewType.equals("ImageVIew")){
    item(position).addView(new ImageVIew(context));
    }
    

    Good Luck

    0 讨论(0)
  • 2020-12-20 12:49

    You need to track what views have been added based on the backing data. I would probably add any necessary extra views in onBindViewHolder(), and remove any that might be present in onViewRecycled(). Then when you want to make one appear dynamically, change whatever variable you have tracking whether it should be visible, and call notifyItemChanged().

    0 讨论(0)
  • 2020-12-20 12:56

    Based on this:

    but those previously added Views are still there, but now on the wrong item.

    Basically, as per the RecyclerView documentation, You have to reset the views everytime inside the onBindViewHolder() method,

    so let say, you have a method that sets a view param if its your profile, so the code for the same goes as follows,

    if (list.get(position).getId()==PreferenceManager.getUserID())
    {
      // do some view change here
    setViewParam(true);
    }else
    {
      // reset the view change here
    setViewParam(false);
    }
    

    So what you're doing here is giving recycled ViewHolder a chance to reset. Do comment if you need help!

    0 讨论(0)
  • 2020-12-20 12:57

    First of all, can you share some more code please?

    Second, why would you want to dynamically add new views on fly? Why don't you use different VIEWTYPE or just have those view already on your layout and just make them visible/invisible or visible/gone? (I believe it will be more efficient this way).

    Let me remind you something about RecyclerView, yes when user is scrolling viewHolder are being reused (few of them can be created, even more than it needs to fill the screen). So if it happened that you added some views on "item A" and user scroll to "item Z", that viewHolder can be reused for that "item Z", hence the show up of the previously added views.

    How can you solve that?

    Well always check on every items if you need to add new views, if yes add them if not already added, else always remove those views (if present) to return to default viewHolder state (or whatever you call it).

    Hope this will help you.

    0 讨论(0)
提交回复
热议问题