【问题标题】:notify RecyclerView adapter from fragment从片段通知 RecyclerView 适配器
【发布时间】:2016-09-23 21:12:25
【问题描述】:

我有一个带有对话框片段的 RecyclerView,我通过对话框从用户那里获取数据并将其存储在数据库中,然后我将其显示在 recyclerview 中,这一切正常,我的问题是,当我添加数据时我必须重新启动应用程序才能将其显示到回收器中,我如何通知适配器数据发生变化?

对话框片段中的添加按钮

  add = (Button) rootView.findViewById(R.id.addbutton);
    add.setOnClickListener(this);

 private void insert() {
        Title = addTitle.getText().toString();
        Des= addDesc.getText().toString();
        db.insertIntoDB(Title, Des);}
    @Override
    public void onClick(View v) {
        if (addTitle.getText().toString().trim().equals("")) {
            addTitle.setError(" Title is required!");
        } else if (addDesc.getText().toString().trim().equals("")) {
            addDesc.setError(" Postion is required!");
        }

        Toast.makeText(getContext(),"your data is saved", Toast.LENGTH_SHORT).show();
        insert();
    }

这是帮助类中的getdata方法

public List<ToDoModule> getDataFromDB(){
    List<ToDoModule> modelList = new ArrayList<ToDoModule>();
    String query = "select * from "+ TODO_TABLE;
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(query,null);
    if (cursor.moveToFirst()){
        do {

            ToDoModule model = new ToDoModule();
            model.setActionTitle(cursor.getString(1));
            model.setActionDesc(cursor.getString(2));
            modelList.add(model);
        }while (cursor.moveToNext());
    }
    return modelList;
}

这是主要活动

public class MainActivity extends AppCompatActivity {
public List<ToDoModule> dbList;
RecyclerView mRecyclerView;
DatabaseHelpher helpher;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().hide();
    helpher = new DatabaseHelpher(this);
    dbList= new ArrayList<ToDoModule>();
    dbList = helpher.getDataFromDB();
    mRecyclerView = (RecyclerView)findViewById(R.id.AppRecyclerView);
    mRecyclerView.setHasFixedSize(true);
    mLayoutManager = new LinearLayoutManager(this);
    mRecyclerView.setLayoutManager(mLayoutManager);
    mAdapter = new RecyclerAdapter(this,dbList);
    this.dbList =helpher.getDataFromDB();
    mAdapter.notifyDataSetChanged();
    mRecyclerView.setAdapter(mAdapter);
    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setImageResource(R.drawable.ic_action_name);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            FragmentManager fm = getSupportFragmentManager();
            addAction add = new addAction();
            add.show(fm,"fragment_edit_name");
        }});}

@Override
protected void onResume() {
    super.onResume();
}
}

【问题讨论】:

    标签: android sqlite android-fragments


    【解决方案1】:

    DialogFragments 与所有 Fragment 一样,直接与使用它们的 Activity 的生命周期相关联。因此,在用户关闭 dialogFragment 后,活动不会调用 onResume() 回调。

    为了简单和易于维护,我会创建一个接口

    public interface DialogFragUpdateListener {
        public void OnDBUpdate();
    }
    

    您的活动将实施

    public class MainActivity extends AppCompatActivity implements  DialogFragUpdateListener{
    

    每当用户完成您让他们在 DialogFragment 中执行的操作时都会收到 回调。在调用 insert() 之后,我会将其添加到您的 onClick() 方法中:

    (DialogFragUpdateListener)getActivity()).OnDBUpdate()
    

    然后在你的activity中,这个回调方法可以让他们从数据库中查询更新的数据,并再次更新adapter/recyclerview:

     public void OnDBUpdate() {
            // Requery data from database here
         getDataFromDB();
        }
    

    查看此内容以供参考: https://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity

    【讨论】:

      猜你喜欢
      • 2017-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-11
      • 1970-01-01
      • 2020-07-29
      相关资源
      最近更新 更多