Как изменять значения в ListView?
у меня есть ListView в который я вставляю значения через adapter значения беру из ArayList. Вот сама установка адаптера.
ListAdapter adapter = new CustomAdapter(this, pizzaNames, R.layout.adapter_backet, from, to);
listView.setAdapter(adapter);
В коде я изменяю переменные, но при этом на экране изменения появляются только после перезапуска активности т.к. адаптер устанавливается в методе onCreat. Так вот вопрос, как сделать так что бы при нажатии кнопки + или - изменялось значения сразу на экране.
код активности где устанавливается адаптер:
public class BasketPage extends Activity {
List<Map<String, String>> pizzaNames = new ArrayList<>();
public String name;
public String phoneNumber;
public String street;
public String home;
public String porch;
public String level;
public String apprt;
public String comment;
public boolean b;
WorkBD workBD;
MainActivity mainActivity;
public void culculateFprice(){
TextView FinalBuy = (TextView) findViewById(R.id.buyText);
int Pprice = MainActivity.pepperoni.getFinalPrice();
int Cprice = MainActivity.calzone.getFinalPrice();
int QCprice = MainActivity.quattrostagioni.getFinalPrice();
int QFprice = MainActivity.quattroformaggi.getFinalPrice();
int Mprice = MainActivity.mexican.getFinalPrice();
int FinalPrice = Pprice + Cprice + QCprice + QFprice + Mprice;
FinalBuy.setText("Стоимось вашего заказа: " + FinalPrice + " руб.");
}
public void creator() {
System.out.println(MainActivity.pepperoni.getCount());
if (MainActivity.pepperoni.getCount() != 0) {
Map<String, String> map = new HashMap<>();
map.put("text1", "Пепперони ");
map.put("text2", MainActivity.pepperoni.getCount() + " шт.");
pizzaNames.add(map);
}
if (MainActivity.calzone.getCount() != 0) {
Map<String, String> map = new HashMap<>();
map.put("text1", "Кальцоне ");
map.put("text2", MainActivity.calzone.getCount() + " шт.");
pizzaNames.add(map);
}
if (MainActivity.quattrostagioni.getCount() != 0) {
Map<String, String> map = new HashMap<>();
map.put("text1", "Четыре сезона ");
map.put("text2", MainActivity.quattrostagioni.getCount() + " шт.");
pizzaNames.add(map);
}
if (MainActivity.quattroformaggi.getCount() != 0) {
Map<String, String> map = new HashMap<>();
map.put("text1", "Четыре сыра ");
map.put("text2", MainActivity.quattroformaggi.getCount() + " шт.");
pizzaNames.add(map);
}
if (MainActivity.mexican.getCount() != 0) {
Map<String, String> map = new HashMap<>();
map.put("text1", "Мексиканская ");
map.put("text2", MainActivity.mexican.getCount() + " шт.");
pizzaNames.add(map);
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.bascket_page);
mainActivity= new MainActivity();
creator();
ListView listView = (ListView) findViewById(R.id.titles);
String [] from = {"text1" , "text2"};
int [] to = {R.id.textok1 , R.id.textok2};
ListAdapter adapter = new CustomAdapter(this, pizzaNames, R.layout.adapter_backet, from, to);
listView.setAdapter(adapter);
culculateFprice();
workBD = new WorkBD(this);
}
...
}
код Castom adapter:
public class CustomAdapter extends SimpleAdapter {
public CustomAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) {
super(context, data, resource, from, to);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View inflatedLayout = super.getView(position, convertView, parent);
Button plus = inflatedLayout.findViewById(R.id.plus);
Button minus = inflatedLayout.findViewById(R.id.minus);
final ArrayList <String> Pizzas = new ArrayList<>();
if(MainActivity.pepperoni.getCount() != 0)
Pizzas.add("pizza1");
if(MainActivity.calzone.getCount() != 0)
Pizzas.add("pizza2");
if(MainActivity.quattrostagioni.getCount() != 0)
Pizzas.add("pizza3");
if(MainActivity.quattroformaggi.getCount() != 0)
Pizzas.add("pizza4");
if(MainActivity.mexican.getCount() != 0)
Pizzas.add("pizza5");
plus.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Log.i(TAG, "Button was clicked for list item " + position);
boolean b = true;
int i = 0;
while(b){
i++;
String j = "pizza" + i;
if(j.equals(Pizzas.get(position))){
b = false;
if(i == 1) {
int y = MainActivity.pepperoni.getCount();
MainActivity.pepperoni.setCount(y+1);
}
if(i == 2) {
int y = MainActivity.calzone.getCount();
MainActivity.calzone.setCount(y + 1);
}
if(i == 3) {
int y = MainActivity.quattrostagioni.getCount();
MainActivity.quattrostagioni.setCount(y + 1);
}
if(i == 4) {
int y = MainActivity.quattroformaggi.getCount();
MainActivity.quattroformaggi.setCount(y + 1);
}
if (i == 5) {
int y = MainActivity.mexican.getCount();
MainActivity.mexican.setCount(y + 1);
}
}
}
}
});
minus.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Log.i(TAG, "Button was clicked for list item " + position);
boolean b = true;
int i = 0;
while(b){
i++;
String j = "pizza" + i;
if(j.equals(Pizzas.get(position))){
b = false;
if(i == 1) {
int y = MainActivity.pepperoni.getCount();
MainActivity.pepperoni.setCount(y - 1);
}
if(i == 2) {
int y = MainActivity.calzone.getCount();
MainActivity.calzone.setCount(y - 1);
}
if(i == 3) {
int y = MainActivity.quattrostagioni.getCount();
MainActivity.quattrostagioni.setCount(y - 1);
}
if(i == 4) {
int y = MainActivity.quattroformaggi.getCount();
MainActivity.quattroformaggi.setCount(y - 1);
}
if (i == 5) {
int y = MainActivity.mexican.getCount();
MainActivity.mexican.setCount(y - 1);
}
}
}
}
});
return inflatedLayout;
}
}
Ответы (1 шт):
Вы можете использовать метод
adapter.notifyDataSetChanged();
Но я бы вам вообще рекомендовал отказаться от ListView в пользу RecyclrRView. В нынешних реалиях никто не использует ListView. RecyclerView быстрее, он реализует паттерн ViewHolder, что дает более быструю подгрузку данных за счет переиспользования ячеек. Он более гибок и в нем легче работать с анимациями кликами. И вообще это в целом более современное решение, в котором нет тех проблем которыми обладает ListView.
Помимо notifyDataSetChanged() в RecyclerView можно обновлять данные выборочно (только те которые изменились, а не весь список) с помощью DiffUtils.
