gpt4 book ai didi

android - 异步删除 ListView/RecyclerView 项的最佳实践

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:04:55 24 4
gpt4 key购买 nike

我有一个带有 CursorLoaderListView。用户可以打开 ListView 项目(打开另一个 Fragment)或删除项目。所有数据库操作都是异步发生的,通常只需要几分之一秒。但从技术上讲,用户可以删除一个项目,然后在删除回调和原因和错误之前打开该项目。处理这个问题的最佳方法是什么?以下是我看到的选项。

  1. 假设 AsyncTask 总是足够快地发生以避免问题
  2. 在UI线程上进行数据库操作
  3. AsyncTask 之前使 ListView 无效(但这会导致 UI 闪烁)
  4. AsyncTask 期间以某种方式阻止用户输入

编辑:我最终使用了 RecyclerView,但在删除项目之前我无法调用 adapter.notifyItemRemoved(itemPos)来自数据库。

最佳答案

您的最佳选择是使用 RecyclerView。因为当您单击删除时,您可以调用 adapter.notifyItemRemoved(itemPos)。因此,列表项将从您的 RecyclerView 中以动画方式删除,您无需担心删除操作的结果。

请参阅 Creating Lists and Cards 上的 Android 开发人员教程:

Use the RecyclerView widget when you have data collections whose elements change at runtime based on user action or network events.

这是一个例子:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> implements View.OnClickListener, View.OnLongClickListener {

private ArrayList<String> mDataset;
private static Context sContext;

public MyAdapter(Context context, ArrayList<String> myDataset) {
mDataset = myDataset;
sContext = context;
}

@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_text_view, parent, false);

ViewHolder holder = new ViewHolder(v);
holder.mNameTextView.setOnClickListener(MyAdapter.this);

holder.mNameTextView.setTag(holder);

return holder;
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {

holder.mNameTextView.setText(mDataset.get(position));

}

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


@Override
public void onClick(View view) {
ViewHolder holder = (ViewHolder) view.getTag();
if (view.getId() == holder.mNameTextView.getId()) {
**//Important !!!**
notifyItemRemoved(getPosition());
// Make your database operation also here
}
}



public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView mNumberRowTextView;
public TextView mNameTextView;


public ViewHolder(View v) {
super(v);

mNameTextView = (TextView) v.findViewById(R.id.nameTextView);
}
}

关于android - 异步删除 ListView/RecyclerView 项的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36390104/

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