使用新数据更新时,RecyclerView不会更新其视图

时间:2016-02-08 10:22:53

标签: android android-recyclerview

我有一个带有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”获得调用,我希望列表重绘自己,从而将最后显示的元素绘制为普通项而不是页脚,但这只发生在我开始在列表中滚动时。 谢谢你 索伦

1 个答案:

答案 0 :(得分:0)

您可以添加到onBindViewHolder:

        if (position == getItemCount() - 1) {
            // request more transactions
        }

然后你的回调调用add方法,该方法应调用notifyDataSetChanged:

    public void add(Transaction transaction) {
        transactions.add(transaction);
        notifyDataSetChanged();
    }

有一个没有页脚here的工作示例。

如果您需要一个好的库来轻松处理RecyclerView中的页眉/页脚,您应该尝试SectionedRecyclerViewAdapter