从另一个活动刷新RecyclerView

15

我有一个带有片段的主Activity,该片段具有从数据库检索的所有数据填充的Recyclerview。在此片段中,我有一个按钮,该按钮调用另一个活动以将对象插入到数据库中。

问题是当活动结束并返回到主活动时,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 替代 onResume。 - Dhaval Parmar
你必须使用HashSet来排除重复元素。 - N J
5个回答

13
将新的项目传回 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

    }
}

1
RecyclerView的点击事件在RecyclerView的适配器中,而不是MainActivity中,那么我该如何获取它呢? - Htoo Aung Hlaing
感谢Wesley接受我的编辑,也谢谢你的回答,你对我正在工作中的项目帮助很大:) - Lucas P.

3

你可以在活动(假设为firstActivity)中创建静态RecyclerView(假设为mRecyclerView),以显示你的RecyclerView。 当在其他活动(假设为secondActivity)中向列表添加新项时,你只需使用

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

我使用这种方法一段时间了,没有遇到任何性能问题,但是请确保使用您自己的代码进行测试。


这是一种有效的方法,但只有在第二个活动中更新适配器时才能起作用,如下所示:firstActivity.mRecyclerview.setAdapter(List<data>)。 - Hossain Ehsani

1

如果有人需要的话...

我遇到了同样的问题: 我有一个名为MainActivity的活动,其中包含一个片段,该片段具有一个从数据库中检索所有数据填充的 RecyclerView 。在此片段中,我有一个按钮调用另一个 activity (insertA)将对象插入数据库。

问题出在当 activity (insertA)结束并返回到主活动时, RecyclerView 没有显示我刚刚创建的新项目。

所以我在 Fragment 按钮中使用了这个,它调用了另一个 activity (insertA)

btn_addNew.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent myIntent = new Intent(context, insertA.class);
        startActivity(myIntent);
    }
});

不要使用finish();来结束程序!!!!!!!

insertA活动中,在方法AddNewThingToTheDataBase()中,不要使用finish();startActivity(Intent);,而是使用onBackPressed();

public void AddNewThingToTheDataBase(){
    *****Inserting in DB code;
    onBackPressed();
}

在Fragment(或您的RecyclerView所在的位置)中添加以下代码

@Override
public void onResume() {
    super.onResume();
    *YourUpdateRecyleViewFunction();*
}

更新: 再次阅读了您的问题并决定在我的回答中添加一些信息。 由于这个“.addItem”方法,您的应用程序onResume认为您仍在添加新项。在通知适配器之前,您需要添加某种检查。

应该是这样的:

@Override
public void onResume() {
        super.onResume();
        if(itemWasAdded){ adapterItem.addItem(MyApplication.getWritableDatabase().getAllItems());
           listProjectsView.scrollToPosition(0);
           itemWasAdded=false;
        }
    }

在这种情况下,您的应用程序 onResume 将理解该项已添加,并通知适配器,如果该项已经添加或未添加,则不会通知适配器。 并且不要忘记为布尔值“itemWasAdded”创建逻辑!因此,仅当插入该项时才为真!

0
尝试像这样,
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中显示 - 我猜它是在活动完全可见之前添加的。你知道我怎么才能从另一个活动中添加一个项目,并在我返回到主活动时在recyclerview上以动画方式添加吗? - Simon

0
你可以将 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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接