【问题标题】:RecyclerView data move to other items when I scroll or add new item当我滚动或添加新项目时,RecyclerView 数据移动到其他项目
【发布时间】:2019-03-12 18:30:00
【问题描述】:

我正在尝试制作一个可以添加项目的 recyclerView,每个项目都有 EditText 和 CheckBox、ImageView 等。

我成功创建了添加新项目的功能,它在onBindViewHolder() 中保存了TextWatcher 的数据。并且TextView的数据保持良好。

这是onBindViewHolder()

    @Override
    public void onBindViewHolder(@NonNull final EditMessageViewHolder holder, final int position) {
        MessageItem item = items.get(position);
        holder.messageET.setText(item.getMessage());
        holder.messageET.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                items.get(position).setMessage(charSequence.toString());
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });
    }

这是适配器中的addItem()getMessageItem()

    public void addItem(MessageItem messageItem) {
        items.add(messageItem);
        notifyItemInserted(items.size());
    }

    public ArrayList<MessageItem> getMessageItems() {
        return items;
    }

但是,问题是当我添加更多项目或向上或向下滚动时。数据混合在错误的顺序和错误的数据中。我该如何处理这个问题以及如何防止 CheckBox 和 ImageView 出现这个问题?

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    我认为不要在 onBindViewHolder() 中使用位置,而是尝试使用适配器位置。这可能会解决您的问题。

    MessageItem item = items.get(position);
    

    改为使用

    MessageItem item = items.get(holder.adapterPosition);
    

    让我知道这是否有效。

    如果这不起作用,请尝试使用 notifyItemInsertedRange 代替 notifyiteminserted。

    谢谢

    【讨论】:

    • 我在哪里可以得到adapterPosition?参数只是holderposition
    • holder.adapterPosition @c-an 。试试这个,让我知道它是否有效?
    • 我猜它正在工作!谢谢。有什么不同??出了什么问题?
    【解决方案2】:

    您是否尝试过 setHasFixedSized(true) 或 setHasStableIds(true) 方法?

    第一种方法将允许 RecyclerView 在其适配器内容更改时避免整个布局无效。 第二种方法为每个项目设置稳定的 id。

    【讨论】:

    • 不,我从未尝试过setHasFixedSized(true)setHasStableIds(true)。我应该把方法放在哪里?在活动中?或适配器中的哪个部分?
    • 在将适配器设置为 recyclerview 后,您可以在活动/片段中使用 yourRecylerView.setHasFixedSize(true);
    • setHasStableIds(true) 呢?
    • setHasFixedSized(true) 固定高度。我不需要这个,因为 RecyclerView 是可滚动的。当我添加新项目时,高度不会改变。这不是我想要的。
    猜你喜欢
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    相关资源
    最近更新 更多