Я сделал listViewAdapter, который получает данные из трех EditText и отображает их, но проблема в том, что если я нажимаю кнопку добавления, первая запись перезаписывается новыми записями. Я хочу добавить данные, которые будут в списке.

Вот мой код для Android:

 public class List extends AppCompatActivity {

private EditText etItem;
private EditText etQty;
private EditText etRate;

public static String item;
public static String qty;
public static String rate;
private ArrayList<HashMap> list;
public listviewAdapter adapter;


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

    etItem=(EditText)findViewById(R.id.etItem);
    etQty=(EditText)findViewById(R.id.etQty);
    etRate=(EditText)findViewById(R.id.etRate);

    item=etItem.getText().toString();
    qty=etQty.getText().toString();
    rate=etRate.getText().toString();



    Button bAdd=(Button)findViewById(R.id.bAdd);
    bAdd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            ListView lview = (ListView) findViewById(R.id.listview);
            populateList();
            listviewAdapter adapter = new listviewAdapter(List.this, list);
            lview.setAdapter(adapter);
            adapter.notifyDataSetChanged();
            etItem.setText("");
            etQty.setText("");
            etRate.setText("");
        }
    });
}
private void populateList() {
    list = new ArrayList<HashMap>();
    item=etItem.getText().toString();
    qty=etQty.getText().toString();
    rate=etRate.getText().toString();
    HashMap temp = new HashMap();

    temp.put(FIRST_COLUMN,"");
    temp.put(SECOND_COLUMN, item);
    temp.put(THIRD_COLUMN, qty);
    temp.put(FOURTH_COLUMN, rate);
    list.add(temp);
}
1
user6644103 3 Сен 2016 в 17:05

2 ответа

Вы должны сделать так, чтобы все повторно используемые параметры были глобальными. сделать объект ListView и объект класса адаптера и данные списка глобально и не переназначать с помощью нового конструктора. Добавьте этот код выше метода onCreate и удалите его из повторного назначения.

ListView lview;
listviewAdapter adapter;

В методе onCreate

lview = (ListView) findViewById(R.id.listview);
list = new ArrayList<HashMap>();
adapter = new listviewAdapter(List.this, list);
lview.setAdapter(adapter);

Теперь добавьте три параметра в метод populateList (), например

populateList(String item,String qty,String rate)

Теперь добавляем данные из события Button onClick, используя

item=etItem.getText().toString();
qty=etQty.getText().toString();
rate=etRate.getText().toString();
populateList(item,qty,rate);

А также вызовите notifyDataSetChanged для обновления адаптера и ListView, добавьте это в последнюю строку метода populateList

adapter.notifyDataSetChanged();
0
Rahul Mandaliya 3 Сен 2016 в 14:34

Упаковка хеш-карты в список (адаптер) - нонсенс :)

1) создать простое pojo

https://en.wikipedia.org/wiki/Plain_Old_Java_Object

public class Item {
      private String _itemName;
      private int _qty;
      private int _rate;

     public Item(String itemName, int qty, int rate) {
         _itemName = itemName;
         _qty = qty;
         _rate = rate;
     }

     // create getter/setter if need 

    public String getName() { return _itemName;}
    // if you want create setter 
    // then keep in mind your 
    // item _itemName variable could not be marked as final 
    public void setName(String name) { _itemName = name;} 
}

2) создать адаптер, расширяющий, например, класс BaseAdapter https://developer.android.com/reference/android/widget/BaseAdapter. html

public class MyAdapter extends BaseAdapter {

    private List<item> _myList;

   public MyAdapter(Context context, List<Item> myList) {
         // context is useful to use for create an inflater and getView method
         _context = context;  
         // check on list here 
         // instantiate new if need (if you plane to use method on list) 
         // to avoid null pointer exceptions 
        _myList = myList;
   }
       // implement rest methods methods for base adapter 
       //  getView() , id etc 
       // implement methods to add delete clear (on list) 


      public void addItem(Item item) {
         // do some chcks on list is not empty etc 
          _myList.add(item);
        // notify adapter observers to update their states
        notifyDatasetChanged();
      }
}

3) используйте адаптер со списком:

  // create list to hold items 
  List<Items> listItems = new ArrayList<>()
  // create item 1
  Item item1 = new Item(String,int,int);
  // add item 1
  listItems.add(item1);
  Item item2 = new Item(String,int,int);
  listItems.add(item2)
  // create adapter 
  MyAdapter myAdapter = new MyAdapter(Context, listItems) 
  //set adapter 
  listView.setAdapter(myAdapter);

 // later you can re-user adapter 
 Adapter adapter = listView.getAdapter() 
 if(adapter !=- null && MyAdapter.class.isAssingableFromClass(adapter.getClass) {
     // do cast 
     MyAdapter myAdapter = MyAdapter(adapter);
     // add new item 
     myAdapter.addItem( new Item (...););
} 

Полный пример:

https://github.com/c3ph3us/examples/blob/master/VaultListAdapter.java

Другие примеры и информация:

ArrayAdapter предпочтительнее BaseAdapter, если вы просто загружаете простой список объектов - cricket_007

вы имеете в виду использовать или продлить?

ArrayAdapter :

Конкретный BaseAdapter, поддерживаемый массивом произвольных объектов. По умолчанию этот класс ожидает, что предоставленный идентификатор ресурса ссылается на один TextView . Если вы хотите использовать более сложный макет, используйте конструкторы, которые также принимают идентификатор поля. Этот идентификатор поля должен ссылаться на TextView в большом ресурсе макета.

  1. Я не вижу смысла и мне нужно использовать больше ресурсов здесь

  2. на мой взгляд, использование более сложных классов / библиотек не позволит вам изучать язык - вы должны использовать низкоуровневый подход, чтобы получить новые навыки

0
Community 23 Май 2017 в 11:45