Я сделал 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);
}
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();
Упаковка хеш-карты в список (адаптер) - нонсенс :)
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
Другие примеры и информация:
- http://abhiandroid.com/ui/baseadapter-tutorial-example.html
- http://androidadapternotifiydatasetchanged.blogspot.com/
- Как настроить просмотр списка с помощью baseadapter
ArrayAdapter предпочтительнее BaseAdapter, если вы просто загружаете простой список объектов - cricket_007
вы имеете в виду использовать или продлить?
ArrayAdapter :
Конкретный BaseAdapter, поддерживаемый массивом произвольных объектов. По умолчанию этот класс ожидает, что предоставленный идентификатор ресурса ссылается на один TextView . Если вы хотите использовать более сложный макет, используйте конструкторы, которые также принимают идентификатор поля. Этот идентификатор поля должен ссылаться на TextView в большом ресурсе макета.
Я не вижу смысла и мне нужно использовать больше ресурсов здесь
на мой взгляд, использование более сложных классов / библиотек не позволит вам изучать язык - вы должны использовать низкоуровневый подход, чтобы получить новые навыки
Похожие вопросы
Связанные вопросы
Новые вопросы
android
Android — это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфонов, планшетов, автомобилей, телевизоров, одежды, очков, IoT). Для тем, связанных с Android, используйте теги, специфичные для Android, такие как android-intent, android-activity, android-adapter и т. д. Для вопросов, отличных от разработки или программирования, но связанных с Android framework, используйте эту ссылку: https://android .stackexchange.com.