Кнопочный смартфон на андроиде
Сложный список с кнопками
Последнее обновление: 06.03.2017
Ранее были расмотрены кастомные адаптеры, которые позволяют выводить в списки сложные данные. Теперь пойдем дальше и рассмотрим, как мы
можем добавить в списки другие элементы, например, кнопки, и обрабатывать их события.
Для этого вначале определим следующий класс Product:
package com.example.eugene.listapp;
public class Product {
private String name;
private int count;
private String unit;
Product(String name, String unit){
this.name = name;
this.count=0;
this.unit = unit;
}
public String getUnit() {
return this.unit;
}
public void setCount(int count) {
this.count = count;
}
public int getCount() {
return count;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
}
Данный класс хранит название, количество продукта, а также единицу измерения. И объекты этого классы будем выводить в список.
Для этого в папку res/layout добавим новый файл list_item.xml:
Здесь определены два текстовых поля для вывода названия и количества продукта и две кнопки для добавления и удаления однйо единицы продукта.
Теперь добавим класс адаптера, который назовем ProductAdapter:
package com.example.eugene.listapp;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.TextView;
import java.util.ArrayList;
class ProductAdapter extends ArrayAdapter {
private LayoutInflater inflater;
private int layout;
private ArrayList productList;
ProductAdapter(Context context, int resource, ArrayList products) {
super(context, resource, products);
this.productList = products;
this.layout = resource;
this.inflater = LayoutInflater.from(context);
}
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if(convertView==null){
convertView = inflater.inflate(this.layout, parent, false);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
}
else{
viewHolder = (ViewHolder) convertView.getTag();
}
final Product product = productList.get(position);
viewHolder.nameView.setText(product.getName());
viewHolder.countView.setText(formatValue(product.getCount(), product.getUnit()));
viewHolder.removeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int count = product.getCount()-1;
if(count
Для каждой кнопки здесь определен обработчик нажатия, в котором мы уменьшаем, либо увеличиваем количество продукта на единицу и затем переустанавливаем текст в
сооветствующем текстовом поле.
Далее в файле activity_main.xml определим элемент ListView:
<?xml version="1.0" encoding="utf-8"?>
И изменим класс MainActivity:
package com.example.eugene.listapp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
ArrayList products = new ArrayList();
ListView productList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(products.size()==0){
products.add(new Product("Картофель", "кг."));
products.add(new Product("Чай", "шт."));
products.add(new Product("Яйца", "шт."));
products.add(new Product("Молоко", "л."));
products.add(new Product("Макароны", "кг."));
}
productList = (ListView) findViewById(R.id.productList);
ProductAdapter adapter = new ProductAdapter(this, R.layout.list_item, products);
productList.setAdapter(adapter);
}
}
В итоге получится следующий проект:
И после запуска приложения мы сможем управлять количеством продуктов через кнопки:








