当来自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));
}
}
答案 0 :(得分:0)
您应该使用CursorLoader自动监听Uri
中的更改。并通过contentResolver.notifyChanged(uriOfInsertedData)
通知更改。野兽的方式是使用ContentProvider
使所有的东西都适当地运作。
或者为了更简单的方法,在数据库的单例中注册一个Observer,并在更改时通知它。一般来说,这将做同样的事情,你不会在组件之间有任何关系。这需要一些代码才能发布,所以我希望你能解决它。
根据您的评论更新2016-03-09
如果您实施了示例1,它不会告诉您如何监控更改。这种情况没有现成的机制。
实现此机制的最佳方法是使用Observer模式。
我会选择一个托管观察员的单身人士。
您可以扩展Observable(已经存储了存储观察者列表的逻辑,通知并删除它们)并制作单例。
通过在需要监听的地方调用addObserver()
来注册观察者(不要忘记调用deleteObserver()
以避免活动泄漏)。
现在,无论何时拨打insert
或以任何方式修改数据库,请务必致电notifyObservers("tablename")
单身Observable
。
这样所有观察者都会收到通知表被修改的通知(传递一个表名是一个例子,你可以使用任何对象通知你的组件有关更改)
然后在update()
的{{1}}中,检查您要监控的表是否已更新,如果是,请按照正常情况重新加载数据。