2016-03-07 38 views
0

當用戶從FragmentDialog輸入他的數據到edittext並按下保存按鈕時,數據應立即顯示在recyclerView,但該dosn't發生。要獲得/顯示最新的數據,你必須重啓應用RecyclerView不會立即顯示插入的SQLite數據

我使用了一個臨時的解決方案,我通過一個接口傳遞從FragmentDialogmainActivity數據,然後我直接將數據傳遞到ArrayList中的recyclerView。這項工作,但似乎不像一個propor解決方案。我希望有一個「正確」的方式來做到這一點

我也試圖設置adapter.notifyDataSetChanged();不同的地方,沒有任何succses

DialogFragment類當用戶鍵入他的數據並隨後insertet到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

您應該使用CursorLoader這對於Uri變化自動監聽。並通過contentResolver.notifyChanged(uriOfInsertedData)通知更改。野獸的方法是使用ContentProvider使所有的東西適當地工作。

或者爲了更簡單的方法,請爲您的數據庫在單例中註冊一個Observer,並在更改時通知它。一般情況下,這樣做也是一樣的,組件之間不會有任何關係。它需要一些代碼發佈,所以我希望你能弄明白。

更新2016年3月9日,根據您的評論

如果您實施例1中,它不會告訴你如何監視更改。這種情況沒有現有的機制。

實現此機制的最佳方法是使用Observer模式。

我會去搭載一個觀察者的單身人士。

您可以擴展Observable(它已經具有用於存儲觀察者列表的邏輯,用於通知和刪除它們)並創建它的單例。

通過調用addObserver()註冊觀察者,無論您需要聆聽(不要忘記撥打deleteObserver()以避免活動泄漏)。

現在,無論您何時致電insert或以任何方式修改數據庫,請務必致電單身的Observable單身人士。

這樣,所有觀察員將得到通知表被修改(通過一個表名是一個例子,你可以用任何物體存在,告知您關於變更部件)

然後在update()Observer,支票如果你希望監視的表被更新,如果是這樣,按照通常的方式重新加載數據。

+0

我剛剛實施辦法1#從這個例子: http://www.androiddesignpatterns.com/2012/05/correctly-managing-your-sqlite-database.html 但它不到風度說一下什麼觀察員。我應該在單身法中註冊一個Observer嗎? – Muddz

+0

@Muddz我已經更新了我的答案。 –