Не виден
У меня есть список, используя вид переработчика. В списке есть 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);