2016-04-06 5 views
0

Я работаю над приложением списка продуктов и не могу обновить представление списка после добавления нового элемента. После добавления нового элемента в базу данных ListView не обновляется. Если я перейду на страницу сведений о деталях, а затем вернусь к основной деятельности, функция onCreate снова будет вызвана, и она обновит ее правильно.Как обновить ListView после добавления новых элементов?

Если я вызываю метод refresh в методе addItemToDb() (on button clicked), он дублирует мои элементы, но не добавляет их в базу данных. У кого-нибудь была эта проблема раньше ??? Вот код:

Список вид адаптера

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

И основная деятельность

@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"); 

     } 
    } 

ответ

2

Вы должны вызвать refreshData() в вашей addItemToDb функции, как:

 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(); 

     } 

Но если вам необходимо автоматически обновлять данные из базы данных, вам нужно использовать CursorAdaptor и использовать Content Providers

UPDATE

также изменить getAllItems() функцию в dbhandler и включают в себя следующее заявление в первой строке функции:

modelArrayList.clear(); 
+0

I ранее использовал функцию refreshData() в функции addItemToDb. проблема в том, что приложение не запускает ни одного элемента в списке, пока я не добавлю новый элемент. И если я назову его в onCreate и снова в функции addItemToDb, он дублирует мои объекты – Adrian

+0

Что произойдет, если вы добавите два элемента подряд? все же вы получаете дублированный список? – Pooya

+0

Да. с refreshData() в onCreate и в функции addItemToDb это выглядит так: – Adrian

Смежные вопросы