Android - динамическое обновление пользовательского ListView после добавления элементов в ArrayList

У меня есть действие, которое отображает изначально заполненный пользовательский ListView, взятый из ArrayList, пользователь может добавить в этот список, который у меня нет проблем с хранением. Я'У меня проблемы с отображением добавленных элементов. Пока что коды, которые я вижу в Интернете, используют ArrayAdapter, и онитолько используя простой listView, а не пользовательский.

Вот связанные файлы:

list_row_layout.xml



  

  

  


Вот часть в моем activity_order_form.xml, которая имеет элемент listView.



    

    

    

    

Вот класс, где хранятся ArrayList.

public class CurrentOrderClass {

  private String productName;

  //ArrayLists
  private ArrayList variantArray = new ArrayList();
  private ArrayList unitArray = new ArrayList();
  private ArrayList quantityArray = new ArrayList();


  //TODO ArrayList functions
  public ArrayList getUnitArray() {
    return unitArray;
  }

  public void setUnitArray(ArrayList unitArray) {
    this.unitArray = unitArray;
  }

  public void addToUnitArray(String unit){
    this.unitArray.add(unit);
  }



  public ArrayList getQuantityArray() {
    return quantityArray;
  }

  public void setQuantityArray(ArrayList quantityArray) {
    this.quantityArray = quantityArray;
  }

  public void addToQuantityArray(int quantity){
    this.quantityArray.add(quantity);
  }



  public ArrayList getVariantArray() {
    return variantArray;
  }

  public void setVariantArray(ArrayList variantArray) {
    this.variantArray = variantArray;
  }

  public void addToVariantArray(String variantArray){
    this.variantArray.add(variantArray);
  }
}

Вот файл CustomListAdapter.java

public class CustomListAdapter extends BaseAdapter {

  private ArrayList listData;

  private LayoutInflater layoutInflater;

  public CustomListAdapter(Context context, ArrayList 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;
  }


}

Это часть моей деятельности OrderForm.java, в которой показаны onCreate и метод, который заполняет listView, а также часть, где вводится пользовательский ввод.

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


}

Я также пытался разместитьcustomListAdapter.notifyDataSetChanged(); после записи в журнал, но ничего не произошло. Любые идеи кто-нибудь? Благодарю.

РЕДАКТИРОВАТЬ ПОСЛЕ ОТВЕТОВ И МОДИФИКАЦИЙ.

Просто следуй ФДОтветьте ниже и добавьте указанную там функцию, а затем вызовите 2 функции. Теперь вы хотите изменить свойgetListData() функционировать так:

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;

}

Первое условие выполняется, когда есть элемент за пределами предварительно заполненного, поскольку оператор else зацикливается только до предварительно заполненного элемента (номер позиции 9, индекс 0). Этот цикл гарантирует, что все, что вы добавляете в ArrayList, добавляется в ListView.

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

Ответы на вопрос(1)

Ваш ответ на вопрос