Удалить элемент ListView из базы данных onClick, используя шаблон MVP - PullRequest
0 голосов
/ 14 октября 2019

Я реализую шаблон MVP в своем приложении, и мне нужно удалить элемент из ListView и базы данных при нажатии кнопки удаления, но я не хочу создавать экземпляр БД в адаптере, иначе я будуломая схему MVP, как я понимаю.

Класс адаптера

public class ProductoAdapter extends ArrayAdapter<Product> {

    private Context mContext;
    private int layoutResourceId;
    private List<Product> listaProductos;

    public ProductoAdapter(@NonNull Context context, int resource, List<Product> list) {
        super(context,0,list);
        mContext = context;
        layoutResourceId = resource;
        listaProductos = list;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        View listItem = convertView;
        if(listItem == null) {
            listItem = LayoutInflater.from(mContext).inflate(R.layout.producto,parent,false);
            ButterKnife.bind(this,listItem);
        }

        final Product currentProducto = listaProductos.get(position);

        TextView name = listItem.findViewById(R.id.nameTextView);
        name.setText(currentProducto.getName());

        TextView kilos = listItem.findViewById(R.id.kilosTextView);
        kilos.setText(String.valueOf(currentProducto.getKilos()));

        TextView price = listItem.findViewById(R.id.priceTextView);
        price.setText(String.valueOf(currentProducto.getPricePerKilo()));

        ImageButton delete = listItem.findViewById(R.id.delete_btn);

        return listItem;
    }
}

Полагаю, мне следует использовать deleteButton.setOnClickListener (), но как мне это реализовать с помощью шаблона MVP?

Ответы [ 3 ]

2 голосов
/ 14 октября 2019

Как вы указали, используйте deleteButton.setOnClickListener() в адаптере. Вот ссылка на макет этого.

Интерфейс - Для обратного вызова из адаптера - Удалить элемент Действие → Действие

interface OnItemClickListener {
 void onItemClick(int itemId)
}

Действие - Реализует интерфейс → Обрабатыватьобратный вызов из адаптера - действие удаления элемента

Presenter - обработка события из Activity для вашего докладчика

public class YourActivity extends AppCompatActivity implements
OnItemClickListener, YourView {

YourPresenter presenter;
YourAdapter adapter;
...

adapter.setListener(this);
....
 @Override
 public void onItemClick(final int itemId) {
// Your callback
 presenter.delete(itemId)
 }
}

Adapter - регистрация обратного вызова, который будет отправлен в Activity

 public class ProductoAdapter extends ArrayAdapter<Product> {
 private final OnItemClickListener listener;

  public setListener(final OnItemClickListener listener) {
   this.listener = listener;
  } 

  @NonNull
  @Override
  public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    View listItem = convertView;
    if(listItem == null) {
        listItem = LayoutInflater.from(mContext).inflate(R.layout.producto,parent,false);
        ButterKnife.bind(this,listItem);
    }

    final Product currentProducto = listaProductos.get(position);
    ...
    ImageButton delete = listItem.findViewById(R.id.delete_btn);

     delete.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
     listener.onItemClick(convertView, position, name);
       }
      });

    return listItem;
    }
 }
1 голос
/ 14 октября 2019

Вы можете достичь этого с помощью интерфейса. Ниже приведена реализация

интерфейса

    public interface ProductoItemClickListener {

        void onDeleteClick(Product product);
    }

В адаптере

Определение переменной прослушивателя в классе адаптера private ProductoItemClickListener itemClickListener;

Измените ваш конструктор, как показано ниже

 public ProductoAdapter(@NonNull Context context, int resource, List<Product> list,ProductoItemClickListener itemClickListener ) {
        super(context,0,list);
        mContext = context;
        layoutResourceId = resource;
        listaProductos = list;
        this.itemClickListener = itemClickListener
    }

В методе getView выполните на clicklistener

delete.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
        itemClickListener.onDeleteClick(currentProducto );
});

В действии или фрагменте

private ProductoItemClickListener mItemClickListener = new ProductoItemClickListener(){
    @Override
    public void onDeleteClick(Product product){
       //perform action here
    }
}

При инициализации адаптера передайте этот mItemClickListener в качестве последнего параметра.

Это будет работать !!.

0 голосов
/ 14 октября 2019

Я думаю, что вы можете достичь того, что вы ищете, с помощью композиции, вы можете изменить свой адаптер (конструктор), чтобы получить класс, который должен работать как координатор, который реализует Слушатель. Затем добавьте его в кнопку Delete.

Этот класс должен обработать задачу удаления или вызова метода в вашем адаптере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...