gpt4 book ai didi

android - RecyclerView插入/移除动画删除不需要的对象

转载 作者:太空狗 更新时间:2023-10-29 15:32:24 26 4
gpt4 key购买 nike

请 friend 帮助我解决这个 RecyclerView 问题。我是 RecyclerView 的新手,我创建了一个 RecyclerView,它只有一个类似待办事项的应用程序来管理任务。

问题是:

  • 当我删除任何项目并调用 notifyItemRemoved() 时,它有时会删除不需要的项目并且应用程序崩溃。 (可能是因为索引啮合)
  • 即使我再次调用 setAdapter 进行更新,也会发生意外情况(请参阅代码中的 #here 标记。)。颜色在开始时设置为所需的项目,但在向下滚动后它适用于所有向上滚​​动的项目。

这是我的适配器:

public class RVadapter extends RecyclerView.Adapter<RVadapter.mHolder> {

public List<Task> mTask;
private SQLhelper sql;
private Context mContext;
public RVadapter(Context context)
{
super();
mContext=context;
sql=new SQLhelper(mContext,null);
PlannerAI ai=new PlannerAI();
mTask=ai.generateTaskList(sql.getTasks());
}

public interface listener {
public void refresh();
}

@Override
public void onBindViewHolder(mHolder holder,final int i) {
try {
final Task t = mTask.get(i);
// #here
if(t.getId().equals("Enjoy"))
{
holder.vv.setBackgroundColor(mContext.getResources().getColor(android.R.color.some_color));
}
holder.name.setText(t.getName());
holder.extras.setText(t.getExtras());
holder.id.setText(t.getId());
holder.subject.setText(t.getSubject());
holder.type.setText(t.getType());
holder.noq.setText(t.getNo()+" questions");
holder.del.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(t.id!=null) {
sql.deleteTask(t.id);
mTask.remove(i);
notifyItemRemoved(i);
if (mContext instanceof listener) {
((listener) mContext).refresh();
}
}
}
});
}catch(Exception e){
Log.d("TAG_LOG_EM",e.toString());
}
}


@Override
public mHolder onCreateViewHolder(ViewGroup parent, int viewType) {
mHolder view;
view = null;
try{
View v=LayoutInflater.from(parent.getContext()).inflate(R.layout.planner_item,null);
view=new mHolder(v);

}catch(Exception e){
Log.d("TAG_LOG_EM",e.toString());
}
return view;
}

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

class mHolder extends RecyclerView.ViewHolder{
public TextView name;
public TextView extras;
public TextView id;
public TextView subject;
public TextView type;
public TextView noq;
public View vv;
public ImageView del;

public mHolder(View view){
super(view);
vv=view;
try {
name = (TextView) view.findViewById(R.id.planner_name);
extras = (TextView) view.findViewById(R.id.planner_extras);
id = (TextView) view.findViewById(R.id.planner_id);
del = (ImageView) view.findViewById(R.id.t_delete);
subject = (TextView) view.findViewById(R.id.planner_subject);
type = (TextView) view.findViewById(R.id.planner_type);
noq = (TextView) view.findViewById(R.id.planner_no);
}catch(Exception e){
Log.d("TAG_LOG_EM",e.toString());
}
}

}
}

我不需要 SQL 和 MainActivity 类(如果需要请评论)。请帮助并告知任何建议的代码更改。谢谢!

编辑:刷新函数为:

public void refresh(){

radapter = new RVadapter(this);
rv.setAdapter(radapter);
}

最佳答案

只需将这些函数放入您的 RVadapter 中即可

public void onItemDismiss(int position) {
if(position!=-1 && position<mTask.size())
{
mTask.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, getItemCount());
}
}

它提供适配器中当前存在的元素总数

@Override
public int getItemCount() {
return (null != mTask ? mTask.size() : 0);
}

在你的 onClick() 中,只需添加:

holder.del.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onItemDismiss(i)
}
});

编辑 1: 解释

mTask.remove(position); - 从列表中删除特定位置的元素。

notifyItemRemoved(position); - 通知 RecyclerView Adapter适配器中的数据已在特定位置被删除。

notifyItemRangeChanged(position, getItemCount()); - 通知 RecyclerView Adapter适配器中元素的位置已从位置更改(删除元素索引到列表末尾),请更新它。

if(position!=-1 && position<mTask.size()) - 此条件验证元素的位置不等于 -1,并且元素的位置应小于列表中元素的总大小。因此不会因元素索引而导致不必要的崩溃。

关于android - RecyclerView插入/移除动画删除不需要的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32886781/

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