RecyclerView不会立即显示插入的SQLite数据

时间:2016-03-07 18:01:57

标签: android sqlite android-recyclerview

当来自FragmentDialog的用户将其数据输入edittexts并按下保存按钮时,数据应立即显示在recyclerView中,但该数据不会发生。要获取/显示最新数据,您必须重新启动应用

我使用了一个临时解决方案,我通过接口将数据从FragmentDialog传递到mainActivity,然后我直接将这些数据传递给recyclelerView的arraylist。这项工作,但看起来不像是一个propor解决方案。我希望"正确"这样做的方式

我也试过设置adapter.notifyDataSetChanged();不同的地方,没有任何接触

DialogFragment类,用户键入其数据,然后插入SQLite数据库

public class DialogAdd extends DialogFragment {

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    final View rootView = inflater.inflate(R.layout.add_productdialog,container, false);



    name = (EditText) rootView.findViewById(R.id.dialog_productname);
    quantity = (EditText) rootView.findViewById(R.id.dialog_qantity);
    location = (EditText) rootView.findViewById(R.id.dialog_location);
    normalPrice = (EditText) rootView.findViewById(R.id.dialog_normalPrice);
    offerPrice = (EditText) rootView.findViewById(R.id.dialog_offerPrice);

    okButton = (Button) rootView.findViewById(R.id.dialog_okButton);
    okButton.getBackground().setColorFilter(Color.parseColor("#2fbd4b"), PorterDuff.Mode.MULTIPLY);
    okButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            if (name.getText().toString().isEmpty()) {
                Toast.makeText(context, "You must add a name", Toast.LENGTH_LONG).show();
            } else {


                DialogAddListener addListener = (DialogAddListener) getActivity();

                dbHelper.insertData(name.getText().toString(), quantity.getText().toString(), location.getText().toString(), normalPrice.getText().toString(), offerPrice.getText().toString());
                addListener.getDialogData(name.getText().toString(), quantity.getText().toString(), location.getText().toString(), normalPrice.getText().toString(), offerPrice.getText().toString());


                getDialog().dismiss();
            }


        }
    });

    return rootView;

}

实例化recyclerview,sqlite和适配器的mainActivity类

public class MainActivity extends AppCompatActivity implements DialogAdd.DialogAddListener{



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



    databaseHelper = new DatabaseHelper(this);

    addbutton = (ImageButton) findViewById(R.id.addbtn);
    addbutton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            dialogAdd = new DialogAdd();
            dialogAdd.show(getSupportFragmentManager(), "addDialog");
        }
    });



    //RecyclerView
    recyclerView = (RecyclerView)findViewById(R.id.rv_shoppinglist);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(App.getAppContex());
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(linearLayoutManager);



    initializeData();
    adapter = new ShoplistAdapter(shopListItems);
    recyclerView.setAdapter(adapter);
    adapter.notifyDataSetChanged();

}



private void initializeData(){

    shopListItems = new ArrayList<>();
    resultset = databaseHelper.getAllData();

    if (resultset.moveToFirst()){
        while(!resultset.isAfterLast()){
            shopListItems.add(new ShopListItem(resultset.getString(1), resultset.getString(2), resultset.getString(3), resultset.getString(4), resultset.getString(5)));
            resultset.moveToNext();

            totalPrice.setText("Total cost: $" + "26");
            totalItems.setText("Total items: " + resultset.getCount());
        }
    }
    resultset.close();
}


//This is only used to show the data instantly
@Override
public void getDialogData(String name, String qty, String location, String price1, String price2) {
    shopListItems.add(new ShopListItem(name, qty, location, price1, price2));
}

}

1 个答案:

答案 0 :(得分:0)

您应该使用CursorLoader自动监听Uri中的更改。并通过contentResolver.notifyChanged(uriOfInsertedData)通知更改。野兽的方式是使用ContentProvider使所有的东西都适当地运作。

或者为了更简单的方法,在数据库的单例中注册一个Observer,并在更改时通知它。一般来说,这将做同样的事情,你不会在组件之间有任何关系。这需要一些代码才能发布,所以我希望你能解决它。

根据您的评论更新2016-03-09

如果您实施了示例1,它不会告诉您如何监控更改。这种情况没有现成的机制。

实现此机制的最佳方法是使用Observer模式。

我会选择一个托管观察员的单身人士。

您可以扩展Observable(已经存储了存储观察者列表的逻辑,通知并删除它们)并制作单例。

通过在需要监听的地方调用addObserver()来注册观察者(不要忘记调用deleteObserver()以避免活动泄漏)。

现在,无论何时拨打insert或以任何方式修改数据库,请务必致电notifyObservers("tablename")单身Observable

这样所有观察者都会收到通知表被修改的通知(传递一个表名是一个例子,你可以使用任何对象通知你的组件有关更改)

然后在update()的{​​{1}}中,检查您要监控的表是否已更新,如果是,请按照正常情况重新加载数据。