如何通知数据是从sqlite更改为recycleler视图?

时间:2016-09-23 18:34:41

标签: android sqlite android-recyclerview

我有一个包含 Array ( [0] => ffmpeg version git-2016-07-03-1ad4471 Copyright (c) 2000-2016 the FFmpeg developers [1] => built with gcc 4.1.2 (GCC) 20080704 (Red Hat 4.1.2-55) ... RecyclerView的应用程序,我从用户获取数据到FragmentDialog并且一切正常, 但问题是当我向sql添加数据并在sqlite中显示它我必须重新启动应用程序以显示数据时,我怎么能通知数据被更改?

这是我的RecyclerView

DialogFragment

MainActivity

public class addAction extends DialogFragment implements View.OnClickListener {
    EditText addTitle, addDesc;
    Button add, clear,close;
    private DatabaseHelpher db;
    String Title,Des;

    public addAction() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.addaction, container, false);
        addTitle = (EditText) rootView.findViewById(R.id.todotitle);
        addDesc = (EditText) rootView.findViewById(R.id.tododescription);
        add = (Button) rootView.findViewById(R.id.addbutton);
        add.setOnClickListener(this);
        close = (Button) rootView.findViewById(R.id.Close);
        close.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dismiss();
            }
        });
        clear = (Button) rootView.findViewById(R.id.clear);
        clear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                addTitle.setText("");
                addDesc.setText("");
            }
        });
        return rootView;
    }

    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        getDialog().setTitle("Add Action");
        db = new DatabaseHelpher(getContext());
    }

    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();
    }
}
来自public class MainActivity extends AppCompatActivity { 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(); } }

getdata()方法

SQlHelper

RecyclerViewAdapter

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;
}

2 个答案:

答案 0 :(得分:0)

问题在于这2行。

mAdapter = new RecyclerAdapter(this,dbList);

this.dbList = helpher.getDataFromDB();

首先将dbList的引用设置为适配器,然后将列表的引用更改为您在getDataFromDB()中创建的列表,并且适配器中的列表保留旧的没有项目的列表。

为了修复此更改此代码的第二行 this.dbList.addAll(helpder.getDataFromDB());

并确保调用adapter.notifyDataSetChanged()

编辑:没关系,似乎你在此之前调用数据库。 你确定数据库中有项目吗?

答案 1 :(得分:0)

您需要在MainActivity中创建一个函数来更新Recycler视图中的数据。然后从对话框片段中调用该函数。 在MainActivity中

public void updateData(){
       dbList =helpher.getDataFromDB();
       mAdapter = new RecyclerAdapter(this,dbList);
       mRecyclerView.setAdapter(mAdapter);
}

在对话框片段中,您可以使用界面或将活动实例添加到MainActivity

来执行相同的操作
((MainActivity) grtActivity()).updateData();

或者使用界面。