从另一个 Activity 刷新 Recyclerview

Posted

技术标签:

【中文标题】从另一个 Activity 刷新 Recyclerview【英文标题】:Refresh Recyclerview from another Activity 【发布时间】:2015-08-10 17:20:34 【问题描述】:

我的主要活动带有一个片段,它有一个 Recyclerview 检索从数据库填充的所有数据。在这个片段中,我有一个按钮,它调用另一个活动来将一个对象插入数据库。

问题是当 Activity 结束并返回到 Main Activity 时,Recyclerview 不显示我刚刚创建的新项目。我试过这段代码:

 @Override
    public void onResume() 
            super.onResume();
            adapterItem.addItem(MyApplication.getWritableDatabase().getAllItems());
            listProjectsView.scrollToPosition(0);
        

getAllItems 函数从 sqlite 中检索所有数据。

在我的 Recyclerview 的 adapterItem 上,我得到了这个:

public void addItem(ArrayList<Item> listItems) 
        this.listItems = listItems;
        notifyItemInserted(0);
    

它工作“很好”。主要问题是当我在移动设备中切换到另一个正在运行的应用程序并返回到我开发的应用程序时,onResume 方法会打开并再次显示我的最后一个插入,填充两次这个项目(依此类推,如果我再做一次)。

谢谢

【问题讨论】:

使用 onRestart insted of onResume 使用必须带HashSet,这将排除重复元素 【参考方案1】:

将新项目传回MainActivity,然后自己处理。

1.在MainActivity中,使用startActivityForResult启动第二个Activity,如下:

startActivityForResult(new Intent(this, SecondActivity.class), REQUEST_CODE);

REQUEST_CODE 是一个int

2.在第二个Activity中,像这样覆盖finish

@Override
public void finish() 
    Intent returnIntent = new Intent();
    returnIntent.putExtra("passed_item", itemYouJustCreated);
    // setResult(RESULT_OK);
    setResult(RESULT_OK, returnIntent); //By not passing the intent in the result, the calling activity will get null data.
    super.finish();

3.在 MainActivity 中,像这样覆盖onActivityResult

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) 
        YourItem passedItem = data.getExtras().get("passed_item");
        // deal with the item yourself

    

【讨论】:

recyclerview 点击事件在 RecyclerView 的适配器中,而不是在 MainActivity 中,那么我该如何获得呢? 感谢您接受我的编辑 Wesley 并感谢您的回答,您对我正在进行的项目提供了很大帮助:)【参考方案2】:

您可以在显示您的 recyclerview 的活动(比如说 firstActivity)中创建静态 recyclerview(比如说 mRecyclerview)。 当您在其他活动中将新项目添加到列表中时(比如说 secondActivity),您可以使用

     firstActivity.mRecyclerview.getAdapter().notifyDataSetChanged();

我使用这种方式有一段时间,并没有遇到任何性能问题,但肯定会使用您自己的代码进行测试。

【讨论】:

它是一个有效的方法,但它只会在适配器像这样在第二个活动中更新时起作用:firstActivity.mRecyclerview.setAdapter(List);【参考方案3】:

像这样尝试,

Intent intent = new Intent(Context, YourClass);
startActivityForResult(intent, ADD_ITEM);

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == Activity.RESULT_OK) 
        if (requestCode == ADD_ITEM)
            adapterItem.addItem(MyApplication.getWritableDatabase().getAllItems());
            listProjectsView.scrollToPosition(0);
        
           

希望对你有用

【讨论】:

我尝试过一次,但我无法为 recyclerview 显示添加动画 - 我猜它会在活动完全可见之前添加它。你知道我如何从另一个活动中添加一个项目,并在我导航回我的 mainactivity 时在 recyclerview 上动画添加吗?【参考方案4】:

您可以将recyclerView 设为静态并在onCreate 方法中对其进行初始化

public class MainActivity extends AppCompatActivity 

    protected static RecyclerView recyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.notes_recycler_view);
        
        displayDataOnRecyclerView(this);

    

然后在MainActivity中创建一个方法来显示recyclerView中的数据

public static void displayDataOnRecyclerView(Context context) 

    //using a Linear Layout Manager
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(context);
recyclerView.setLayoutManager(layoutManager);

//data that will be displayed in the adapter from sqlite database
DatabaseHandler databaseHandler = new DatabaseHandler(context);
List<Model> data = databaseHandler.getAllData();

//specifying the adapter
RecyclerView.Adapter adapter = new RecyclerViewAdapter(data,context);
recyclerView.setAdapter(adapter);

最后在另一个Activity中调用displayDataOnRecyclerView方法

MainActivity.displayDataOnRecyclerView(otherActivity.this);

【讨论】:

以上是关于从另一个 Activity 刷新 Recyclerview的主要内容,如果未能解决你的问题,请参考以下文章

Recycler VIew 和 Adapter 打开内容不同的Activity

从另一个 Activity 访问一个 Activity 中的小部件

从另一个 Activity 返回的错误 requestCode onActivityResult

滚动 Recycler View 时有意丢失数据

使用 ListView 从另一个 Activity 打印 ArrayList

从另一个 Activity 类执行 Fragment 中的 AsyncTask 并更新其中的 UI