使用 MVP 模式从数据库中删除列表视图项



我正在我的应用程序中实现 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 模式实现这一点?

正如您所指出的,请在适配器中使用deleteButton.setOnClickListener()。这是对此布局的引用。

接口 - 用于从适配器回调 - 删除项目操作→活动

interface OnItemClickListener {
void onItemClick(int itemId)
}

活动 - 实现接口 → 处理来自适配器的回调 - 删除项操作

演示者 - 处理从活动到演示者的事件

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)
}
}

适配器 - 注册将发送到活动的回调

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;
}
}

您可以使用接口来实现此目的。以下是实现

接口

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 方法中对单击侦听器执行

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 作为最后一个参数传递。

这将起作用!.

我认为您可以使用组合实现您想要的东西,您可以修改适配器(构造函数(以接收一个应该作为实现监听器的协调器的类。然后将其添加到您的删除按钮。

该类应处理在适配器上删除或调用方法的作业。

最新更新