Android – Aggiornamento dinamico di un ListView personalizzato dopo l'aggiunta di elementi in un ArrayList

Ho un'attività che visualizza un ListView personalizzato inizialmente popolato prelevato da un ArrayList, quindi l'utente può aggiungere a questo elenco che non ho problemi a memorizzare. Ho problemi a visualizzare gli elementi aggiunti. Finora, i codici che vedo uso online ArrayAdapter e stanno usando solo il semplice ListView e non uno personalizzato.

Ecco i file correlati:

  • Avviso di lancia per performance negative - 80+ visioni
  • Controllare e evitare perdite di memory nell'applicazione
  • Come aggiungere un metodo click nel sensore
  • La risorsa di servizio di Google Play non è stata trovata
  • I servizi di Google sono obsoleti. Richiede 5089000 ma ha trovato 3136130
  • Come get un evento continuo di touch?
  • list_row_layout.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/variant" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:text="variant" /> <TextView android:id="@+id/quantity" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:text="quantity" /> <TextView android:id="@+id/unit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginRight="221dp" android:layout_toLeftOf="@+id/quantity" android:text="unit" /> </RelativeLayout> 

    Ecco la parte del mio activity_order_form.xml che ha l'elemento di listView.

     <RelativeLayout android:id="@+id/relativeLayout3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_below="@+id/relativeLayout2" android:orientation="vertical" > <TextView android:id="@+id/textViewVariantB" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="94dp" android:text="Variant" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/textViewUnit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginRight="123dp" android:text="Unit" android:textAppearance="?android:attr/textAppearanceLarge" /> <ListView android:id="@+id/listViewProductOrder" android:layout_width="match_parent" android:layout_height="350dp" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_below="@+id/textViewVariantB" > </ListView> </RelativeLayout> 

    Ecco la class in cui sono memorizzati il ​​ArrayList.

     public class CurrentOrderClass { private String productName; //ArrayLists private ArrayList<String> variantArray = new ArrayList<String>(); private ArrayList<String> unitArray = new ArrayList<String>(); private ArrayList<Integer> quantityArray = new ArrayList<Integer>(); //TODO ArrayList functions public ArrayList<String> getUnitArray() { return unitArray; } public void setUnitArray(ArrayList<String> unitArray) { this.unitArray = unitArray; } public void addToUnitArray(String unit){ this.unitArray.add(unit); } public ArrayList<Integer> getQuantityArray() { return quantityArray; } public void setQuantityArray(ArrayList<Integer> quantityArray) { this.quantityArray = quantityArray; } public void addToQuantityArray(int quantity){ this.quantityArray.add(quantity); } public ArrayList<String> getVariantArray() { return variantArray; } public void setVariantArray(ArrayList<String> variantArray) { this.variantArray = variantArray; } public void addToVariantArray(String variantArray){ this.variantArray.add(variantArray); } } 

    Ecco il file CustomListAdapter.java

     public class CustomListAdapter extends BaseAdapter { private ArrayList<CurrentOrderClass> listData; private LayoutInflater layoutInflater; public CustomListAdapter(Context context, ArrayList<CurrentOrderClass> listData) { this.listData = listData; layoutInflater = LayoutInflater.from(context); } @Override public int getCount() { return listData.size(); } @Override public Object getItem(int position) { return listData.get(position); } @Override public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = layoutInflater.inflate(R.layout.list_row_layout, null); holder = new ViewHolder(); holder.variantView = (TextView) convertView.findViewById(R.id.variant); holder.unitView = (TextView) convertView.findViewById(R.id.unit); holder.quantityView = (TextView) convertView.findViewById(R.id.quantity); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.variantView.setText(listData.get(position).getVariantArray().get(position).toString()); holder.unitView.setText(listData.get(position).getUnitArray().get(position).toString()); holder.quantityView.setText(String.valueOf(listData.get(position).getQuantityRow())); return convertView; } static class ViewHolder { TextView variantView; TextView unitView; TextView quantityView; } } 

    Questo fa parte dell'attività di OrderForm.java, che mostra l'onCreate e il metodo che popola l'elencoView, nonché la parte in cui viene presa l'input dell'utente.

     public class OrderForm extends Activity { public TextView tv; private int variantPosition; CustomListAdapter customListAdapter; CurrentOrderClass currentOrder = new CurrentOrderClass(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_order_form); tv = (TextView)findViewById(R.id.textViewProduct); //set variants here popolateItem(); //set current order listview here ArrayList image_details = getListData(); final ListView lv1 = (ListView) findViewById(R.id.listViewProductOrder); customListAdapter = new CustomListAdapter(this, image_details); lv1.setAdapter(customListAdapter); } private ArrayList getListData() { ArrayList results = new ArrayList(); for(int i = 0; i < 10; i++){ currentOrder.getQuantityArray().add(i); currentOrder.getUnitArray().add("Sample text here." + i); currentOrder.getVariantArray().add("Another sample text here" + i); results.add(currentOrder); } return results; } //....snip snip excess code..... //This is the part wherein I add new items to the ArrayList in the class //After this, I'm not sure how to proceed currentOrder.setProductName(product.getName()); currentOrder.addToQuantityArray(newQuantity); currentOrder.addToUnitArray(product.getUnit()[position]); currentOrder.addToVariantArray(product.getVariant()[variantPosition]); Log.d("Angelo", currentOrder.getProductName() + " " + currentOrder.getQuantityArray() + " " + currentOrder.getUnitArray() + " " + currentOrder.getVariantArray()); } 

    Ho anche cercato di posizionare customListAdapter.notifyDataSetChanged(); dopo la voce del registro, ma niente è accaduto. Qualunque idea chiunque? Grazie.

    MODIFICA DOPO RISPOSTE E MODIFICHE.

    Basta seguire la risposta di FD qui sotto e aggiungere la function che ha specificato lì e le 2 chiamate di function dopo di che. Ora, si desidera modificare la function getListData() come questa:

     private ArrayList getListData() { ArrayList results = new ArrayList(); int loopUntil; /* Two scenarios * First ---> the user started the activity for the first time, which means that the pre-populated list is what we want * if this is the case, look at the else part of the boolean statement, it only loops until 10 * and in addition, populates those elements * Second ---> the user has set something already and we want to populate until that element. * */ if(currentOrder.getQuantityArray().size() > 10){ loopUntil = currentOrder.getQuantityArray().size(); for(int i = 0; i < loopUntil; i++){ currentOrder.getQuantityArray(); currentOrder.getUnitArray(); currentOrder.getVariantArray(); results.add(currentOrder); } } else{ loopUntil = 10; for(int i = 0; i < loopUntil; i++){ currentOrder.getQuantityArray().add(i); currentOrder.getUnitArray().add("Sample text here." + i); currentOrder.getVariantArray().add("Another sample text here" + i); results.add(currentOrder); } } return results; } 

    La prima condizione viene eseguita quando c'è un elemento al di là del pre-popolato, poiché l'altra istruzione loopsca solo fino alla voce pre-popolata (numero di articolo 9, indice 0). Questo loop garantisce che tutto ciò che si aggiunge all'ArrayList viene aggiunto al ListView.

    La seconda condizione viene eseguita quando l'attività viene aperta per la prima volta e non si suppone che non vi sia nulla in quella list, tranne quelli che si sono popolati.

  • Aiuto per quanto riguarda l'evento onClick () su un elemento di layout personalizzato di ListView
  • cosa ha causato IOException e pipe rotto
  • Errore: Imansible trovare: com.android.support:support-v4.20.0.+
  • Come generare il gesto zoom / pizzico per il test per Android
  • Impostare l'ascoltatore di animation in animazioni di attività
  • Disegnare bitmap scalabili su un SurfaceView - nessun antialiasing
  • One Solution collect form web for “Android – Aggiornamento dinamico di un ListView personalizzato dopo l'aggiunta di elementi in un ArrayList”

    L'adattatore non ottiene i nuovi dati, perché la stai inizializzando con un proprio insieme di dati.

    Una possibilità sarebbe quella di istanziare un nuovo adattatore e assegnarlo al ListView.

    Aggiungere un field per il tuo ListView nella tua attività:

     public TextView tv; private int variantPosition; CustomListAdapter customListAdapter; CurrentOrderClass currentOrder = new CurrentOrderClass(); ListView myListView; //Listview here 

    In onCreate, impostare myListView per puntare al tuo ListView:

     final ListView lv1 = (ListView) findViewById(R.id.listViewProductOrder) myListView = lv1; 

    Infine, quando modifichi i tuoi dati, crea un nuovo Adattatore per i nuovi dati:

     myListView.setAdapter(new CustomListAdapter(this, getListData()); 

    In alternativa, modificare l'adattatore personalizzato per contenere un metodo setListData:

     public class CustomListAdapter extends BaseAdapter { private ArrayList<CurrentOrderClass> listData; private LayoutInflater layoutInflater; public CustomListAdapter(Context context, ArrayList<CurrentOrderClass> listData) { this.listData = listData; layoutInflater = LayoutInflater.from(context); } public void setListData(ArrayList<CurrentOrderClass> data){ listData = data; } @Override public int getCount() { return listData.size(); } @Override public Object getItem(int position) { return listData.get(position); } @Override public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = layoutInflater.inflate(R.layout.list_row_layout, null); holder = new ViewHolder(); holder.variantView = (TextView) convertView.findViewById(R.id.variant); holder.unitView = (TextView) convertView.findViewById(R.id.unit); holder.quantityView = (TextView) convertView.findViewById(R.id.quantity); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.variantView.setText(listData.get(position).getVariantArray().get(position).toString()); holder.unitView.setText(listData.get(position).getUnitArray().get(position).toString()); holder.quantityView.setText(String.valueOf(listData.get(position).getQuantityRow())); return convertView; } static class ViewHolder { TextView variantView; TextView unitView; TextView quantityView; } } 

    Quindi, dopo aver modificato i tuoi dati, basta call:

     customListAdapter.setListData(getListData()); customListAdapter.notifyDataSetChanged(); 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.