2016-04-06 26 views
0

Bir bakkal listesi uygulaması üzerinde çalışıyorum ve yeni bir öğe ekledikten sonra liste görünümünü yenilemede sorun yaşıyorum. Veritabanına yeni bir öğe ekledikten sonra ListView yenilenmiyor. Öğe ayrıntıları sayfasına gidip ana etkinliğe geri dönersem, onCreate tekrar çağrılır ve doğru bir şekilde yenilenir.Yeni öğeler ekledikten sonra ListView nasıl güncellenir?

addItemToDb() (düğme tıklatıldığında) yönteminde yenileme yöntemini çağırırsam, öğelerimi çoğaltır, ancak bunları veritabanına eklemez. Daha önce bu soruna sahip olan var mı ??? İşte kodudur:

liste görünümü adaptör

public class ItemListViewAdapter extends ArrayAdapter<ItemModel> { 
    Activity activity; 
    int layoutResource; 
    ArrayList<ItemModel> itemModelArrayList = new ArrayList<>(); 

    public ItemListViewAdapter(Activity act, int resource, ArrayList<ItemModel> data) { 
     super(act, resource, data); 

     activity = act; 
     layoutResource = resource; 
     itemModelArrayList = data; 
     notifyDataSetChanged(); 
    } 

    @Override 
    public int getCount() { 
     return itemModelArrayList.size(); 
    } 

    @Override 
    public ItemModel getItem(int position) { 
     return itemModelArrayList.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return super.getItemId(position); 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 

     View row = convertView; 
     final ViewHolder holder; 

     if (row == null || (row.getTag()) == null) { 

      LayoutInflater inflater = LayoutInflater.from(activity); 
      row = inflater.inflate(layoutResource, null); 

      holder = new ViewHolder(); 

      holder.hItemName = (TextView) row.findViewById(R.id.custom_row_productName); 
      holder.hItemPrice = (TextView) row.findViewById(R.id.custom_row_productPrice); 
      holder.hItemType = (TextView) row.findViewById(R.id.custom_row_productType); 
      holder.hCheckBox = (CheckBox) row.findViewById(R.id.custom_row_checkBox); 
      holder.hItemEdit = (ImageView) row.findViewById(R.id.custom_row_edit); 

      row.setTag(holder); 
     } else { 
      holder = (ViewHolder) row.getTag(); 
     } 

     holder.hModel = getItem(position); 

     holder.hItemName.setText(holder.hModel.getItemName()); 
     holder.hItemPrice.setText(String.valueOf(holder.hModel.getItemPrice())); 
     holder.hItemType.setText(holder.hModel.getItemType()); 

     holder.hItemEdit.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       int itemID = holder.hModel.getItemId(); 
       String itemName = holder.hModel.getItemName(); 
       String itemPrice = String.valueOf(holder.hModel.getItemPrice()); 
       String itemType = holder.hModel.getItemType(); 
       String itemDate = holder.hModel.getItemDate(); 

       Intent intent = new Intent(activity, ItemDetail.class); 

       intent.putExtra("id", itemID); 
       intent.putExtra("product", itemName); 
       intent.putExtra("price", itemPrice); 
       intent.putExtra("type", itemType); 
       intent.putExtra("date", itemDate); 

       startActivity(activity, intent, null); 
      } 
     }); 

     return row; 
    } 

    public class ViewHolder { 
     ItemModel hModel; 
     TextView hItemName; 
     TextView hItemPrice; 
     TextView hItemType; 
     TextView hItemDate; 
     CheckBox hCheckBox; 
     ImageView hItemEdit; 
    } 
} 

Ve ana faaliyet

Sen gibi addItemToDb işlevi refreshData() çağırmanız gerekir
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    dbHandler = new DatabaseHandler(getApplicationContext()); 

    itemNameText = (EditText) findViewById(R.id.activity_main_productName); 
    itemPriceText = (EditText) findViewById(R.id.activity_main_productPrice); 
    itemTypeSpinner = (Spinner) findViewById(R.id.activity_main_spinner); 
    addButton = (Button) findViewById(R.id.activity_main_addButton); 
    saveListButton = (FloatingActionButton) findViewById(R.id.activity_main_fab); 


    ArrayAdapter<CharSequence> spinnerAdapter = ArrayAdapter.createFromResource(getApplicationContext(), R.array.productTypes, R.layout.spinner_item); 
    itemTypeSpinner.setAdapter(spinnerAdapter); 


    //USE BUTTONS 
    addButton.setOnClickListener(this); 
    saveListButton.setOnClickListener(this); 

    //LIST_VIEW 
    listView = (ListView) findViewById(R.id.activity_main_listView); 

    //calling methods 
    refreshData(); 
} 

    public void refreshData() { 
    modelArrayListContainer.clear(); 

    //GET ITEMS FROM DB 
    ArrayList<ItemModel> modelArrayListFromDB = dbHandler.getAllItems(); 

    for (int i = 0; i < modelArrayListFromDB.size(); i++) { 

     int ditemID = modelArrayListFromDB.get(i).getItemId(); 
     String dItemName = modelArrayListFromDB.get(i).getItemName(); 
     double dItemPrice = modelArrayListFromDB.get(i).getItemPrice(); 
     String dItemType = modelArrayListFromDB.get(i).getItemType(); 
     String dItemDate = modelArrayListFromDB.get(i).getItemDate(); 

     ItemModel newModel = new ItemModel(); 

     newModel.setItemId(ditemID); 
     newModel.setItemName(dItemName); 
     newModel.setItemPrice((int) dItemPrice); 
     newModel.setItemType(dItemType); 
     newModel.setItemDate(dItemDate); 

     modelArrayListContainer.add(newModel); 
    } 

    //setup Adapter 
    itemListViewAdapter = new ItemListViewAdapter(MainActivity.this, R.layout.custom_product_layout_activity_main, modelArrayListContainer); 
    listView.setAdapter(itemListViewAdapter); 
    itemListViewAdapter.notifyDataSetChanged(); 
} 

     public void addItemToDb() { 
     ItemModel model = new ItemModel(); 

     String spinnerValue = itemTypeSpinner.getSelectedItem().toString(); 
      model.setItemName(itemNameText.getText().toString().trim());  model.setItemPrice(Double.parseDouble((itemPriceText.getText().toString().trim()))); 
model.setItemType(spinnerValue); 

      dbHandler.addItem(model); 
      dbHandler.close(); 

      Log.v(TAG, "::addItemToDb - itemAdded"); 

     } 
    } 

cevap

2

:

 public void addItemToDb() { 
     ItemModel model = new ItemModel(); 

     String spinnerValue = itemTypeSpinner.getSelectedItem().toString(); 
      model.setItemName(itemNameText.getText().toString().trim());  model.setItemPrice(Double.parseDouble((itemPriceText.getText().toString().trim()))); 
model.setItemType(spinnerValue); 

      dbHandler.addItem(model); 
      dbHandler.close(); 

      Log.v(TAG, "::addItemToDb - itemAdded"); 
      refreshData(); 

     } 

Ama verileri otomatik olarak güncellemeniz gerekiyorsa veritabanı, sen CursorAdaptor kullanabilir ve Content Providers

Ayrıca GÜNCELLEME

dbhandler içinde getAllItems() işlevini değiştirmek kullanmak gerekir ve işlevi ilk satırında aşağıdaki ifadeyi içerir:

modelArrayList.clear(); 
+0

ben Daha önce addItemToDb işlevinde refreshData() öğesini çağırmayı denedi. Sorun, uygulama başladığında yeni bir öğe ekleyene kadar liste görünümünde hiçbir öğenin görüntülenmemesidir. Ve eğer addItemToDb işlevinde onCreate ve tekrar içinde ararsam, bir öğeye iki öğe eklerseniz öğelerimi – Adrian

+0

çoğaltır? hala çoğaltılmış liste var mı? – Pooya

+0

Evet. onCreate ve addItemToDb işlevindeki refreshData() ile şu şekilde görünür: – Adrian

İlgili konular