【问题标题】:Android swipe to delete recyclerView itemsAndroid滑动删除recyclerView项目
【发布时间】:2020-09-25 22:24:24
【问题描述】:

我也可以从 firebase 实时数据库中删除我的 recyclerView 项目。但是当我滑动该项目并删除时,顶部的回收器项目会到达我删除的 recyclerview 的位置。我该如何解决?

我的源代码: 我正在尝试在这里滑动和删除回收站项目。

private Toolbar toolbar;
public DatabaseReference duyuruRef;
public RecyclerView recyclerView;
ArrayList<Duyuru> duyurular;
RecyclerAdapter recyclerAdapter;


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

    recyclerView = findViewById(R.id.recyclerDelete);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    duyuruRef = FirebaseDatabase.getInstance().getReference();
    duyuruRef.keepSynced(true);
    duyurular = new ArrayList<>();

    getDataFromFirebase();
    setUpToolbar();

    ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
        @Override
        public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder viewHolder1) {
            return false;
        }

        @Override
        public void onSwiped(@NonNull RecyclerView.ViewHolder target, int i) {
            Duyuru duyuru = new Duyuru();
            DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
            DatabaseReference duyuruRef = rootRef.child("Duyuru");
            String pid = duyuru.getPid();
            int position = target.getAdapterPosition();
            duyuruRef.child(pid).removeValue();
            duyurular.remove(position);
            recyclerAdapter.notifyDataSetChanged();
        }
    });
    helper.attachToRecyclerView(recyclerView);
}

private void getDataFromFirebase() {
    Query query = duyuruRef.child("Duyuru");
    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
                Duyuru duyuru = new Duyuru();
                duyuru.setDuyuruBaslik(snapshot.child("title").getValue().toString());
                duyuru.setDuyuruContext(snapshot.child("context").getValue().toString());
                duyuru.setDuyuruTime(snapshot.child("time").getValue().toString());
                duyuru.setDuyuruDate(snapshot.child("date").getValue().toString());
                duyuru.setDuyuruYazar(snapshot.child("yazar").getValue().toString());

                duyurular.add(duyuru);
            }
            recyclerAdapter = new RecyclerAdapter(getApplicationContext(),duyurular);
            recyclerView.setAdapter(recyclerAdapter);
            recyclerAdapter.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}

如果你想要我的 RecyclerAdapter,它就在这里:

private Context mContext;
private ArrayList<Duyuru> duyuruArrayList;

public RecyclerAdapter(Context mContext, ArrayList<Duyuru> duyuruArrayList) {
    this.mContext = mContext;
    this.duyuruArrayList = duyuruArrayList;
}

@NonNull
@Override
public RecyclerAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.duyuru_items_layout,parent,false);

    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
    holder.txtBaslik.setText(duyuruArrayList.get(position).getDuyuruBaslik());
    holder.txtContext.setText(duyuruArrayList.get(position).getDuyuruContext());
    holder.txtYazar.setText(duyuruArrayList.get(position).getDuyuruYazar());
    holder.txtTime.setText(duyuruArrayList.get(position).getDuyuruTime());
    holder.txtDate.setText(duyuruArrayList.get(position).getDuyuruDate());

    holder.parentLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(mContext, activity_duyuru_update_screen.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.putExtra("baslik",duyuruArrayList.get(position).getDuyuruBaslik());
            intent.putExtra("context",duyuruArrayList.get(position).getDuyuruContext());
            intent.putExtra("yazar",duyuruArrayList.get(position).getDuyuruYazar());
            intent.putExtra("time",duyuruArrayList.get(position).getDuyuruTime());
            intent.putExtra("date",duyuruArrayList.get(position).getDuyuruDate());
            intent.putExtra("pid",duyuruArrayList.get(position).getPid());
            mContext.startActivity(intent);
        }
    });
}

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

public class ViewHolder extends RecyclerView.ViewHolder {

    TextView txtBaslik,txtContext,txtYazar,txtTime,txtDate;
    RelativeLayout parentLayout;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);

        txtBaslik = itemView.findViewById(R.id.ac_cv_duyuru_baslik);
        txtContext = itemView.findViewById(R.id.ac_cv_duyuru_context);
        txtTime = itemView.findViewById(R.id.ac_cv_duyuru_time);
        txtYazar = itemView.findViewById(R.id.ac_cv_duyuru_yazar);
        txtDate = itemView.findViewById(R.id.ac_cv_duyuru_date);
        parentLayout = itemView.findViewById(R.id.ac_items_layout);
    }
}

【问题讨论】:

  • 请向我们展示该行为的具体示例。
  • 我已经展示了查看活动中的 ItemTouchHelper 类和 RecyclerAdapter onBindViewHolder

标签: java android firebase firebase-realtime-database


【解决方案1】:

使用 ItemTouchHelper 类

ItemTouchHelper itemTouchHelper = new ItemTouchHelper(newItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT|ItemTouchHelper.LEFT) {
        @Override
        public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
           return false;
        }

        @Override
        public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
              notifyItemRemoved(getAdapterPosition());
              notifyItemRangeChanged(getAdapterPosition(), MainActivity.arrList.size());

        }
    });

    itemTouchHelper.attachToRecyclerView(recyclerView);

【讨论】:

  • 哦,抱歉,我没看到。您可以使用 notifyItemRemoved(getAdapterPosition()); notifyItemRangeChanged(getAdapterPosition(),MainActivity.arrList.size());
猜你喜欢
  • 1970-01-01
  • 2019-09-22
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
相关资源
最近更新 更多