gpt4 book ai didi

android - 删除项目后,RecyclerView 不更新

转载 作者:行者123 更新时间:2023-11-30 00:01:26 24 4
gpt4 key购买 nike

我正在实现一个 RecyclerView 来显示事务列表。在它的两个 ViewHolder 之一中,有一个删除事务的按钮。问题是,单击按钮后,RecyclerView 没有任何反应。我正在使用 Realm 和 MVP 模式,并尝试了我能找到的所有解决方案,但似乎没有任何效果。

这是 TransactionListActivity,其中将显示 RecyclerView:

public class TransactionListActivity extends BaseActivity implements TransactionListView {

private static final String TAG = "TransactionListActivity";

@Inject
TransactionListPresenterInterface<TransactionListView> mPresenter;

TransactionListAdapter transactionListAdapter;

@BindView(R.id.transaction_list_recyclerview)
RecyclerView transactionListRecyclerView;

@Override
public void onPrepareTransactionListAdapter() {
LinearLayoutManager layoutManager
= new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);

transactionListRecyclerView.setLayoutManager(layoutManager);

List<TransactionListItem> transactionListItems = mPresenter.getAllTransactionItems();

transactionListAdapter = new TransactionListAdapter(this, transactionListItems);
transactionListAdapter.setOnDeleteTransactionClickListener(this::onDeleteTransaction);

transactionListRecyclerView.setAdapter(transactionListAdapter);

}

@Override
public void onDeleteTransaction(String id) {
mPresenter.onDeleteTransactionClick(String id);
}

@Override
public void refresh() {
transactionListAdapter.notifyDataSetChanged();
}


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_transaction_list);

getActivityComponent().inject(this);

setUnBinder(ButterKnife.bind(this));
ButterKnife.bind(this);

mPresenter.onAttach(this);

onPrepareTransactionListAdapter();
}

这是我的适配器:

public class TransactionListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

private static final String TAG = "TransactionListAdapter";

private Context context;
public List<TransactionListItem> transactionListItems;
private OnDeleteTransactionClickListener mOnDeleteTransactionClickListener;

public TransactionListAdapter(Context context, List<TransactionListItem> transactionListItems) {
this.context = context;
this.transactionListItems = transactionListItems;
}

class TransactionItemViewHolder extends RecyclerView.ViewHolder {

...

@BindView(R.id.delete_transaction_button)
Button deleteTransactionButton;

...

public TransactionItemViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}

class TransactionDateViewHolder extends RecyclerView.ViewHolder {
...
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

RecyclerView.ViewHolder viewHolder = null;
LayoutInflater inflater = LayoutInflater.from(parent.getContext());

switch(viewType) {

case TransactionListItem.TYPE_DATE:
//inflate TransactionDateViewHolder here

case TransactionListItem.TYPE_TRANSACTION:
//inflate TransactionItemViewHolder here
}

return viewHolder;
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {

switch(viewHolder.getItemViewType()) {

case TransactionListItem.TYPE_TRANSACTION:

ProductStockRecord productStockRecord = (ProductStockRecord) transactionListItems.get(position);
TransactionItemViewHolder transactionItemViewHolder = (TransactionItemViewHolder) viewHolder;
// populate view with data here
((TransactionItemViewHolder) viewHolder).deleteTransactionButton.setOnClickListener(v -> {
if (mOnDeleteTransactionClickListener != null) {
mOnDeleteTransactionClickListener.onDeleteTransactionClick(productStockRecord.getId());
}
});
break;

case TransactionListItem.TYPE_DATE:

//populate view with data here
break;

}

}

@Override
public int getItemCount() {
return transactionListItems.size();
}

@Override
public int getItemViewType(int position) { return transactionListItems.get(position).getType(); }

public void setOnDeleteTransactionClickListener(final OnDeleteTransactionClickListener onDeleteTransactionClickListener) {
mOnDeleteTransactionClickListener = onDeleteTransactionClickListener;
}

public interface OnDeleteTransactionClickListener {
void onDeleteTransactionClick(String id);
}

这是我的主持人:

public class TransactionListPresenter<V extends TransactionListView> extends BasePresenter<V> implements TransactionListPresenterInterface<V>, RealmDataManager.OnTransactionCallback {

private static final String TAG = "TransaxListPresenter";

@Inject
public TransactionListPresenter(final RealmDataManager realmDataManager) { super(realmDataManager); }

@Override
public List<TransactionListItem> getAllTransactionItems() {
List<ProductStockRecord> productStockRecordList = getRealmDataManager().getAllProductStockRecords();

List<TransactionListItem> transactionListItems = new ArrayList<>();
// preprocess transactions here

return transactionListItems;
}

@Override
public void onDeleteTransactionClick(String id) {
getRealmDataManager().deleteProductStockRecord(id, this);
getView().refresh();
Log.d(TAG,"deleteTransaction() performed");
}

这是 RealmService 的更新(和工作)版本,上面的所有代码都已相应修复:

public void deleteProductStockRecord(final String id, final OnTransactionCallback onTransactionCallback) {
mRealm.executeTransactionAsync(realm -> {
ProductStockRecord productStockRecord = realm.where(ProductStockRecord.class).equalTo("id", id).findFirst();
productStockRecord.deleteFromRealm();
}, () -> {
if (onTransactionCallback != null) {
onTransactionCallback.onRealmSuccess();
}
}, error -> {
if (onTransactionCallback != null) {
onTransactionCallback.onRealmError(error);
}
});
}

我相信我在我的适配器实现中的某个地方犯了一些错误。如果有人能帮助我解决问题、指出我的错误或指出正确的方向,我将非常感激。提前致谢

最佳答案

我认为问题可能是对 List<TransactionListItem> 的引用未在您的适配器中更新。

如果您在演示者中查看这段代码:

@Override
public List<TransactionListItem> getAllTransactionItems() {
List<ProductStockRecord> productStockRecordList = getRealmDataManager().getAllProductStockRecords();

List<TransactionListItem> transactionListItems = new ArrayList<>();
// preprocess transactions here

return transactionListItems;
}

您正在创建一个新的 List<TransactionListItem>这是你的适配器指向的。所以在你的onDeleteTransactionClick方法,您必须确保在调用 getView().refresh() 之前将更新的列表传递给您的适配器.因为否则,适配器中的列表将不会更改,您将看到该项目未被删除。

理想情况下,我建议使用类似 DiffUtil 的东西(或手动计算)得到删除项的位置并调用notifyItemRemoved而不是刷新整个 RecyclerView .

关于android - 删除项目后,RecyclerView 不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49845346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com