【问题标题】:How to use notifyDataSetChanged() correctly to update my reyclerview如何正确使用 notifyDataSetChanged() 来更新我的 recyclerview
【发布时间】:2022-01-30 21:57:03
【问题描述】:

我想了解如何在我的 MainActivity 中正确使用 notifyDataSetChanged()。 我希望它在从用户获取联系信息的对话框片段关闭后立即启动。

我将它添加到 storeDataInArrays() 的末尾,以便在添加新联系人时更新列表,但目前它不执行任何操作。

我在 logcat 中也没有收到任何错误,所以我不知道我做错了什么。

这是主要活动

public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
//widgets
public ImageButton eAddContact;
RecyclerView recyclerView;

DatabaseHelper myDB;
ArrayList<String>Contact_id,Contact_Name,Contact_Number;
CustomAdapter customAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    eAddContact = findViewById(R.id.btnAddContact);
    eAddContact.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Log.d(TAG,"onClick:opening dialog");
            Dialog_AddContact dialog = new Dialog_AddContact();
            dialog.show(getSupportFragmentManager(),"Add Contact Dialog");
        }
    });
    //Toast.makeText(getApplicationContext(),"@#",Toast.LENGTH_SHORT).show();
    myDB = new DatabaseHelper(MainActivity.this);
    Contact_id = new ArrayList<>();
    Contact_Name = new ArrayList<>();
    Contact_Number = new ArrayList<>();
    storeDataInArrays();
    recyclerView = findViewById(R.id.RecyclerView);
    customAdapter= new CustomAdapter(MainActivity.this,Contact_id,Contact_Name,Contact_Number);
    recyclerView.setAdapter(customAdapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
    }
    void storeDataInArrays(){
        Cursor cursor = myDB.getEveryone();
        if(cursor.getCount()==0){
            //Add blank page
        }
        else{
            while (cursor.moveToNext()){
                Contact_id.add(cursor.getString(0));
                Contact_Name.add(cursor.getString(1));
                Contact_Number.add(cursor.getString(2));
            }
        }
        customAdapter= new CustomAdapter(MainActivity.this,Contact_id,Contact_Name,Contact_Number);
        customAdapter.notifyDataSetChanged();
    }
}

在这方面的任何和所有帮助都将不胜感激。

【问题讨论】:

    标签: java android android-studio android-recyclerview adapter


    【解决方案1】:

    storeDataInArrays内部,不需要创建new CustomAdapter(...),直接调用customAdapter.notifyDataSetChanged();即可

    除此之外,您可能还想清理代码并遵循一些代码风格标准。 Google Java Style Guide

    或查看这篇文章:Android Coding Style and Guidelines

    【讨论】:

    • 啊我明白了,只是调用'customAdapter.notifyDataSetChanged();'当我在活动的 onCreate 中初始化适配器后调用“storeDataInArrays”函数时工作。但是当前添加联系人时recyclerview不刷新的问题仍然存在。也谢谢你的指导,从现在开始会尽量小心乱码。
    • 当您覆盖 getItemCount 时,您是否更新了适配器内部的大小?
    • 抱歉,如果我对问题的理解有误,我目前在 else 语句之后有notifyDataSetChanged()。它现在在同一个地方。我设法通过在 dialogfragment 中调用 storeDatainArrays() 方法来解决我的问题,我在 dialogfragment 中使用 ((MainActivity)getActivity()).storeDataInArrays(); 记录联系人。虽然我不确定它如何影响性能,但它似乎确实按照我想要的方式工作。
    猜你喜欢
    • 1970-01-01
    • 2018-08-25
    • 2018-11-23
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    相关资源
    最近更新 更多