Ich versuche eine Kellner-App zu erstellen, mit der der Kellner Bestellungen entgegennehmen kann.

Ich versuche dies mit ListView und setOnItemClickListener zu erreichen.

Meine Idee ist, dass jedes Mal, wenn ein Item auf das ListView geklickt wird, es einem ArrayList<Item> hinzugefügt wird. Was ich später an eine in DataBaseHelper erstellte Methode übergeben kann, die dann die Liste durchläuft und jedes Element aus der Reihenfolge zum SQLite database hinzufügt.

Ich habe die Methode noch nicht in der Klasse DataBaseHelper erstellt, möchte aber wissen, wie Sie zuerst die ArrayList<Item> füllen und dann mit dem nächsten Schritt fortfahren.

Die Tabelle, zu der ich die Liste hinzufügen werde, hat eine manny to many Beziehung und heißt order_item. Was mich auch an eine Frage erinnert, da ich nicht die vollständigen Details zum Item und nur das ID zum Speichern in der Tabelle benötige, um alle Informationen des Artikels abzurufen?

Im Moment kann ich mit der App auf ein Element klicken und es hinzufügen. Anschließend müssen die Apps geschlossen werden.

Ich bin mir auch nicht sicher, ob ich das ArrayList zu einer globalen Variablen machen oder es im Order Object als Variable haben soll.

Das Protokoll sagt:

java.lang.IllegalStateException: Der Inhalt des Adapters hat sich geändert, ListView hat jedoch keine Benachrichtigung erhalten. Stellen Sie sicher, dass der Inhalt Ihres Adapters nicht von einem Hintergrundthread geändert wird, sondern nur vom UI-Thread. Stellen Sie sicher, dass Ihr Adapter notifyDataSetChanged () aufruft, wenn sich der Inhalt ändert. [in ListView (2131165292, Klasse android.widget.ListView) mit Adapter (Klasse 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);


            }
        });

    }
}
0
Dave 27 Aug. 2020 im 18:59

2 Antworten

Beste Antwort

Das Problem war, dass ich der Liste notifyDataSetChanged() nicht mitgeteilt habe, dass das von mir ausgewählte Element hier geändert wurde. Dies ist der Code, der jetzt die Liste auffüllt.

// 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
Dave 27 Aug. 2020 im 19:26
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)); 
              }
           });
0
Dharman 27 Aug. 2020 im 17:10