Recyclerview notifydatasetchanged not working

I have a list using recycler view. List has 3 different types of elements

  • (near xxx, in xxx, etc.)
  • actual item (black rectangle)
  • footer (loadmore) -> footer only if the actual element in one header is more than 3

enter image description here

when loadmore clicked I want to show all remaining actual item in the same title, but when I call notifydatasetchanged the list is not updated,
all remaining actual data was only shown after I scrolled loadmore to an invisible position (top or bottom) and scrolled back
but the list count (getItemCount) is not updated so some items that appear before loading will be removed Note: R.layout.nearby_deal_item and R.layout.last_nearby_deal_item are the same item type (2.actual item) but some have there are only a few fields
here is my code

public class NearbyPromoAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private List<List<String>> list;
    private List<Boolean> isLoadMore;
    private Context context;

    public NearbyPromoAdapter(List<List<String>> list, Context context) {
        this.context = context;
        this.list = list;
        isLoadMore = new ArrayList<>();
        for (int i = 0; i < list.size(); i++) {
            isLoadMore.add(false);
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        if (i == 1) {
            View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.nearby_deal_header, viewGroup,
                    false);
            HeaderViewHolder vh = new HeaderViewHolder(v);
            return vh;
        } else if (i == 2) {
            View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.nearby_deal_item, viewGroup,
                    false);
            ViewHolder vh = new ViewHolder(v);
            return vh;
        } else if (i == 3) {
            View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.last_nearby_deal_item, viewGroup,
                    false);
            ViewHolder vh = new ViewHolder(v);
            return vh;
        } else {
            View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.nearby_deal_footer, viewGroup,
                    false);
            FooterViewHolder vh = new FooterViewHolder(v);
            vh.index = -i;
            return vh;
        }

    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
        if (viewHolder instanceof ViewHolder) {
            ViewHolder holder = (ViewHolder) viewHolder;
            holder.layout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(context, PromoDetailActivity.class);
                    context.startActivity(intent);
                }
            });
        } else if (viewHolder instanceof HeaderViewHolder) {
            HeaderViewHolder holder = (HeaderViewHolder) viewHolder;
            holder.firstText.setText(getItem(i));

        } else if (viewHolder instanceof FooterViewHolder) {
            final FooterViewHolder holder = (FooterViewHolder) viewHolder;
            holder.layout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    isLoadMore.set(holder.index, true);
                    final NearbyPromoAdapter adapter = NearbyPromoAdapter.this;
                    // TODO
                }
            });
        }
    }

    private class RefreshTask extends AsyncTask<NearbyPromoAdapter, NearbyPromoAdapter,
            NearbyPromoAdapter> {
        protected NearbyPromoAdapter doInBackground(NearbyPromoAdapter... adapter) {
            return adapter[0];
        }

        protected void onPostExecute(NearbyPromoAdapter result) {
            result.notifyDataSetChanged();
        }
    }

    @Override
    public long getItemId(int i) {
        return 0;
    }

    public String getItem(int position) {
        int index = 0;
        for (int i = 0; i < list.size(); i++) {
            if (index == position) {
                return "Title " + i;
            }
            index++;
            if (list.get(i).size() <= 3) {
                for (int j = 0; j < list.get(i).size(); j++) {
                    if (index == position) {
                        return list.get(i).get(j);
                    }
                    index++;
                }
            } else if (isLoadMore.get(i) == false) {
                for (int j = 0; j < 4; j++) {
                    if (index == position) {
                        if (j == 3)
                            return "Footer";
                        else
                            return list.get(i).get(j);
                    }
                    index++;
                }
            } else {
                for (int j = 0; j < list.get(i).size(); j++) {
                    if (index == position) {
                        return list.get(i).get(j);
                    }
                    index++;
                }
            }

        }
        return null;
    }

    @Override
    public int getItemViewType(int position) {
        int index = 0;
        for (int i = 0; i < list.size(); i++) {
            if (index == position) {
                return 1;
            }
            index++;
            if (list.get(i).size() <= 3) {
                for (int j = 0; j < list.get(i).size(); j++) {
                    if (index == position) {
                        if (j == list.get(i).size() - 1)
                            return 3;
                        else
                            return 2;
                    }
                    index++;
                }
            } else if (isLoadMore.get(i) == false) {
                for (int j = 0; j < 4; j++) {
                    if (index == position) {
                        if (j == 3)
                            return -i;
                        else
                            return 2;
                    }
                    index++;
                }
            } else {
                for (int j = 0; j < list.get(i).size(); j++) {
                    if (index == position) {
                        if (j == list.get(i).size() - 1)
                            return 3;
                        else
                            return 2;
                    }
                    index++;
                }
            }

        }
        return 999;
    }

    @Override
    public int getItemCount() {
        int count = list.size();
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).size() <= 3) {
                count += list.get(i).size();
            } else if (isLoadMore.get(i) == false) {
                count += 4;
            } else {
                count += list.get(i).size();
            }

        }
        return count;
    }


    public List<List<String>> getList() {
        return list;
    }

    public void setList(List<List<String>> list) {
        this.list = list;
        isLoadMore.clear();
        for (int i = 0; i < list.size(); i++) {
            isLoadMore.add(false);
        }
    }
}

      

below are all my attempts (with // TODO)

adapter.notifyDataSetChanged();

      


NearbyPromoActivity act = (NearbyPromoActivity) context;
                act.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        adapter.notifyDataSetChanged();
                    }
                });

      


new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                        adapter.notifyDataSetChanged();
                    }
                });

      


new RefreshTask().equals(adapter);

      

+3
android android-recyclerview notifydatasetchanged


source to share


No one has answered this question yet

Check out similar questions:

877
Why doesn't RecyclerView have onItemClickListener ()?
868
How to add separators and spaces between items in RecyclerView?
782
How do I create a RecyclerView with multiple view types?
511
RecyclerView onClick
286
Update ViewPager dynamically?
2
Scrolling lagged after applying font in Recycler view items
1
SetView Ringbone
0
Saving the state of a ToggleButton to a ListView using SharedPreferences
-1
android.content.res.Resources $ NotFoundException: in setImageResource



All Articles
Loading...
X
Show
Funny
Dev
Pics