Не виден

У меня есть список, используя вид переработчика. В списке есть 3 различных типа предметов

  1. заголовок (рядом с ххх, в области ххх и т. д.)
  2. фактический предмет (черный прямоугольник)
  3. нижний колонтитул (loadmore) -> нижний колонтитул показывает только, если фактический элемент в одном заголовке больше 3

при нажатии loadmore я хочу показать все оставшиеся фактические элементы в том же заголовке, но когда я вызываю notifydatasetchange, список не обновляется,
все оставшиеся фактические элементы отображаются только после того, как я прокручиваю грузоподъемное устройство в невидимое положение (сверху или снизу) и прокручиваю его назад
но счетчик списка (getItemCount) не обновляется, поэтому некоторые элементы, отображаемые до нажатия кнопки loadmore, исчезнут
примечание: R.layout.nearby_deal_item и R.layout.last_nearby_deal_item относятся к одному и тому же типу элемента (2. фактический элемент), только имеют некоторое разное поле в некотором представлении.
вот мой код

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);
        }
    }
}

ниже это все мои попытки (на //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);

0 ответов

Другие вопросы по тегам