首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何让android RecyclerView中的列表在修改它所显示的内容的活动之后更新?

如何让android RecyclerView中的列表在修改它所显示的内容的活动之后更新?
EN

Stack Overflow用户
提问于 2018-08-08 05:49:50
回答 1查看 84关注 0票数 0

我见过一些简单地在单击侦听器中修改项的RecyclerView示例。我的问题是,我通过单击一个项目来启动一个活动,而该活动可以更改或删除列表中被单击的项目。因此,需要在活动完成后更新视图。这段代码主要来自另一个开发人员,它将序列化的项和项的位置作为额外数据传递给活动。该位置旨在用于稍后更新视图。

然而,我发现了这些评论:

“不要将position视为固定的;只能立即使用并调用holder.getAdapterPosition()以在以后查找它。当项在数据集中的位置发生更改时,RecyclerView不会再次调用onBindViewHolder,除非该项本身无效或无法确定新位置。因此,在此方法内获取相关数据项时应仅使用position参数,而不应保留其副本。如果以后需要某项的位置(例如,在单击侦听器中),请使用getAdapterPosition(),它将具有更新的适配器位置。”

在适配器中:

代码语言:javascript
复制
@Override
public void onBindViewHolder (@NonNull ItemAdapter.MyViewHolder holder, final int position)
{
    final Item item = items.get(position);
    holder.itemTitle.setText(item.getTitle());
    holder.lay_item.setOnClickListener (new View.OnClickListener () {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(context, ItemDetailActivity.class);
            intent.putExtra("Item", item);
            intent.putExtra("position", position);
            context.startActivity (intent);
            // TODO is this the place to refresh the view?
            //holder.getAdapterPosition();
        }
    });
}

对于活动:

代码语言:javascript
复制
Item currentItem;

protected void onCreate (Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_item_detail);

    currentItem = (Item)getIntent().getSerializableExtra("Item"));
    position = getIntent().getExtras().getInt("position");
    ... 
}

我意识到视图持有的对象被序列化为额外的数据,因此活动中的currentObject不是同一个对象。

我不知道他们为什么要那样做。如果这是常态,请告诉我如何更新列表视图以更改活动中的对象。如果这不是常态,应该怎么做呢?这就是这个问题的基础,在标题中写道:我如何让android RecyclerView中的列表在修改它所显示的内容的活动之后更新?

在该活动中,有一个单击侦听器,用于单击“保存”按钮来更新数据库:

代码语言:javascript
复制
    btn_save.setOnClickListener (new View.OnClickListener () {
        @Override
        public void onClick(View v) {
            // ... stuff that updates the item attributes from the view elements... 
            // Save it. It is this object that should then be in the list in the RecyclerView.
            try
            {
                MyApp.getDatabase().updateItem(item);
                // TODO: This might work if currentItem was actually the one in the list
                //adapter.notifyDataSetChanged();
            }
            catch (PersistenceException ex)
            {
                // notify user of failure
                Toast.makeText (EditItemActivity.this, getResources().getString(R.string.item_update_fail), Toast.LENGTH_LONG).show ();
                finish();
                return;
            }

            Toast.makeText(EditItemActivity.this, getResources().getString(R.string.item_update_success), Toast.LENGTH_LONG).show ();
            finish ();
        }
    });

适配器是在如下所示的片段中创建的(其中"rv_items“是RecyclerView):

代码语言:javascript
复制
        adapter = new ItemAdapter(itemList, getActivity());
        rv_items.setAdapter(adapter);

Item类声明为:类Item implements

EN

回答 1

Stack Overflow用户

发布于 2018-08-08 06:13:14

通常,任何时候当您谈论“修改RecyclerView”时,都暗示着您看待事物的方式是错误的。您应该始终考虑修改 data ,然后意识到RecyclerView只是显示该数据的一种方式。当然,无论何时修改数据,都需要调用像notifyDataSetChanged()这样的方法,以便RecyclerView能够知道如何更新其显示以获取更改,但是您仍然应该始终首先考虑数据。

也就是说,这里的问题根源在于您需要某种方法来在数据项列表中唯一地标识您的项。一般来说,我倾向于在这里使用某种唯一的ID (而不是position)。然后,当您的第二个活动完成并返回其结果时,您可以使用该ID来更新数据列表并将更改分派到RecyclerView。

有了所有这些,你就会有这样的东西:

代码语言:javascript
复制
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == MY_REQUEST) {
        if (resultCode == Activity.RESULT_OK && data != null) {
            String id = data.getStringExtra("id");

            for (int i = 0; i < items.size(); ++i) {
                if (items.get(i).getId().equals(id)) {
                    // the item at position i was updated.

                    // insert your code here...

                    // at the end, notify the adapter
                    adapter.notifyItemChanged(i);
                }
            }
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51735914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档