Добавление объектов из ListView в ArrayList для добавления в SQLite

#android #android-studio

#Android #android-studio

Вопрос:

Я пытаюсь создать приложение для официантов, которое позволяет официанту принимать заказы.

Я пытаюсь добиться этого с помощью ListView и setOnItemClickListener .

Моя идея заключается в том, что каждый раз, когда Item нажимается на ListView , он будет добавлен в ArrayList<Item> . Позже я могу передать этот список методу, созданному в DataBaseHelper , который затем выполняет итерации по списку и добавляет каждый элемент из порядка в SQLite database .

Я еще не создал метод в DataBaseHelper классе, но я хотел бы знать, как сначала заполнить ArrayList<Item> , а затем перейти к следующему шагу.

Таблица, в которую я буду добавлять список, имеет manny to many связь и называется order_item . Что также вызывает вопрос, поскольку мне не нужны полные сведения о Item и только ID для сохранения в таблице, нужно ли мне получать всю информацию об элементе?

Прямо сейчас происходит то, что приложение позволяет мне щелкнуть и добавить один элемент, а затем приложения вынуждены закрываться.

Я также не уверен, должен ли я сделать ArrayList глобальную переменную или иметь ее в Order Object качестве переменной?

В журнале говорится:

java.lang.Исключение IllegalStateException: Содержимое адаптера изменилось, но ListView не получил уведомления. Убедитесь, что содержимое вашего адаптера не изменяется из фонового потока, а только из потока пользовательского интерфейса. Убедитесь, что ваш адаптер вызывает notifyDataSetChanged() при изменении его содержимого. [в ListView(2131165292, класс android.widget.ListView) с адаптером (класс android.widget.ArrayAdapter)]

OrderActivity

 public class OrderActivity extends AppCompatActivity {

    EditText waiter_id;
    Button order;
    ListView orderList;

    List<Item> itemList = new ArrayList<Item>();

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

        waiter_id = (EditText) findViewById(R.id.waiter_id);
        order = (Button) findViewById(R.id.order_button);
        orderList = (ListView) findViewById(R.id.item_list);

        //Showing Items on the ListView
        DataBaseHelper dbHelp = new DataBaseHelper(OrderActivity.this);
        final List<Item> itemList = dbHelp.getMenu();
        ArrayAdapter itemArrayAdaptor = new ArrayAdapter<Item>(OrderActivity.this, android.R.layout.simple_list_item_1, itemList);
        orderList.setAdapter(itemArrayAdaptor);

        // setOnItemClickListener
        orderList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            Item item;
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int pos, long id) {                
            //Selecting the Item and storing it in a reference variable to add to itemList

            Toast.makeText(OrderActivity.this, "Order"   pos , Toast.LENGTH_SHORT).show();
            Item item = (Item) adapterView.getAdapter().getItem(pos);
            Toast.makeText(OrderActivity.this, item.toString() , Toast.LENGTH_SHORT).show();
            itemList.add(item);


            }
        });

    }
}
  

Комментарии:

1. можете ли вы показать журнал при принудительном закрытии приложения?

Ответ №1:

Проблема заключалась в том, что я не уведомлял список notifyDataSetChanged() о том, что выбранный мной элемент изменился, вот код, который теперь заполняет список.

 // setOnItemClickListener
        orderList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            Order order;
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int pos, long id) {
                //Selecting the Item and storing it in a reference variable to add to itemList
                Toast.makeText(OrderActivity.this, "Order"   pos , Toast.LENGTH_SHORT).show();
                orderItemList.add((Item) adapterView.getAdapter().getItem(pos));
                itemArrayAdaptor.notifyDataSetChanged();
                Toast.makeText(OrderActivity.this, orderItemList.toString(), Toast.LENGTH_SHORT).show();

            }
        });
  

Ответ №2:

 orderList.setOnItemClickListener(
   new AdapterView.OnItemClickListener() { 
          @Override public void onItemClick(AdapterView<?> adapterView, View 
             view, int pos, long id) { 
                Toast.makeText(OrderActivity.this, "Added" 
                   ,Toast.LENGTH_SHORT).show();
                   itemList.add(adapterView.getItemAtPosition(pos)); 
              }
           });
  

Комментарии:

1. Спасибо, но это не решило проблему, я отредактировал код, и теперь я могу получить выбранный элемент. Но при попытке добавить это в itemList программа вылетает. Я отредактировал вопрос с новым кодом и сообщением об ошибке

2. Привет, @Dave не могли бы вы предоставить журнал ошибок? чтобы у меня был лучший обзор ошибки!