我有一个带有RecyclerView.Adapter实现的RecyclerView,它有一个对象列表以及一个页眉和一个页脚视图,我打开viewType来显示位置0和页脚的头部位置getItemCount()(我的“getItemCount()”实现返回“data.size()+ 2”以适应页眉和页脚)。这一切都很好,标题和脚显示在正确的位置,但当我到达列表的末尾并显示页脚时,我加载更多数据并将其添加到我的“数据”列表,然后我想要页脚视图将替换为下一个加载的数据视图,但这不会发生。我已尝试在适配器上使用不同的“notifyX”方法,但似乎在我滚动列表之前它不会更新(然后它全部按照我的意愿工作)。
我在这里缺少什么?如何强制RecyclerView重绘列表中的最后一个元素?
我的适配器:
private class TransactionsAdapter extends RecyclerView.Adapter {
private List transactions;
private static final int TYPE_HEADER = 0;
private static final int TYPE_ITEM = 1;
private static final int TYPE_FOOTER = 2;
private TransactionsAdapter(List transactions) {
this.transactions = transactions;
}
public void add(Transaction transaction) {
transactions.add(transaction);
notifyItemInserted(transactions.size());
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if(viewType == TYPE_HEADER) {
ViewHolder vh = new ViewHolder(inflate(getContext(), R.layout.postings_list_header, null), TYPE_HEADER);
return vh;
} else if(viewType == TYPE_FOOTER) {
ViewHolder vh = new ViewHolder(inflate(getContext(), R.layout.postings_list_footer, null), TYPE_FOOTER);
return vh;
}
SlidingCellView cellView = new SlidingCellView(getContext());
cellViews.add(cellView);
ViewHolder vh = new ViewHolder(cellView, TYPE_ITEM);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
if (holder.getType() == TYPE_HEADER) {
final TextView text = (TextView) holder.itemView.findViewById(R.id.postings_header_text);
text.setText("Dette er nu godt");
} else if (holder.getType() == TYPE_ITEM) {
final Transaction transaction = transactions.get(position - 1);
((SlidingCellView) holder.itemView).update(new SlidingCellView.SlidingCellViewResources() {
@Override
public String getSlidingCellName() {
return transaction.getText();
}
});
} else if (holder.getType() == TYPE_FOOTER) {
final TextView text = (TextView) holder.itemView.findViewById(R.id.no_more_postings);
if(transactions.size() == 0) {
text.setText(getResources().getString(R.string.no_postings));
} else {
if(resources.getTransactions().hasMore()) {
text.setText(getResources().getString(R.string.more_postings));
} else {
text.setText(getResources().getString(R.string.end_of_postings));
}
}
}
}
@Override
public int getItemCount() {
return transactions.size() + 2;
}
@Override
public int getItemViewType(int position) {
if(position == 0) {
return TYPE_HEADER;
}
if(position == transactions.size() + 1) {
return TYPE_FOOTER;
}
return TYPE_ITEM;
}
public class ViewHolder extends RecyclerView.ViewHolder {
private int type;
public ViewHolder(View itemView, final int type) {
super(itemView);
this.type = type;
}
public int getType() {
return type;
}
}
}
添加到交易的代码:
public void transactionsAdded() {
for (Transaction trans : resources.getTransactions()) {
postingsListAdapter.add(trans);
}
}
因此,如果我滚动到列表的底部,“R.layout.postings_list_footer”视图正确显示在列表的底部,那么当服务调用返回(代码未显示)时,“transactionsAdded”获得调用,我希望列表重绘自己,从而将最后显示的元素绘制为普通项而不是页脚,但这只发生在我开始在列表中滚动时。 谢谢你 索伦
答案 0 :(得分:0)
您可以添加到onBindViewHolder:
if (position == getItemCount() - 1) {
// request more transactions
}
然后你的回调调用add方法,该方法应调用notifyDataSetChanged:
public void add(Transaction transaction) {
transactions.add(transaction);
notifyDataSetChanged();
}
有一个没有页脚here的工作示例。
如果您需要一个好的库来轻松处理RecyclerView中的页眉/页脚,您应该尝试SectionedRecyclerViewAdapter。