【问题标题】:Move object from a RecyclerView to another RecyclerView将对象从 RecyclerView 移动到另一个 RecyclerView
【发布时间】:2021-07-07 10:35:30
【问题描述】:

我目前正在为一些足球场制作预订应用程序。我有两个回收商视图:有效预订和取消预订。我还有一个自定义回收器视图适配器。两个回收器视图使用相同的适配器。

我想要做什么:如果我点击我的有效预订回收视图中的一个按钮,我想从有效预订中删除该预订并将其放入我取消的预订中。我将留下我的自定义适配器,并提及我使用 Firebase 来获取我的预订状态(有效或取消)。

public class RecyclerViewAdapterRezervare extends RecyclerView.Adapter<RecyclerViewAdapterRezervare.RecycleViewHolder> {
    private List<Rezervare> rezervari;
    private Context context;
    private LayoutInflater inflater;
    private String numeUtilizator;
    private String status;

    private Rezervare rezervare = new Rezervare();

    private DatabaseReference reff;

    public RecyclerViewAdapterRezervare(List<Rezervare> rezervari, Context context, String numeUtilizator) {
        this.rezervari = rezervari;
        this.context = context;
        this.numeUtilizator = numeUtilizator;
        this.inflater = LayoutInflater.from(context);
    }

    @NonNull
    @Override
    public RecycleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.rezervari_layout, parent, false);
        return new RecycleViewHolder(view);
    }


    @Override
    public void onBindViewHolder(@NonNull RecycleViewHolder holder, int position) {
        rezervare = rezervari.get(position);

        reff = FirebaseDatabase.getInstance().getReference();


        List<String> listaOre = rezervare.getOre();
        Map<String, Object> mapOre = new HashMap<>();
        for(String ora : listaOre){
            mapOre.put(ora, false);
        }

        // this will return the status ("activa" is the booking is active, or "anulata" is it's cancelled)
        getStatus(rezervare, new StatusCallback() {
            @Override
            public void onCallback(String value) {
                status = value;

                holder.btn_anuleaza.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Log.v("status", status);
                        new AlertDialog.Builder(view.getContext()).setTitle("Anulare rezervare").setMessage("Sunteti sigur ca doriti anularea rezervarii?")
                            .setPositiveButton(R.string.da, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                              
// if the cancel button is clicked, i update my database so the status of the booking will be "anulata" - cancelled                                reff.child("Users").child(numeUtilizator).child("rezervari").child(rezervare.getData()).child(rezervare.getNumeTeren()).child("status").setValue("anulata");
                                reff.child("Rezervari").child(rezervare.getData()).child("Fotbal").child(rezervare.getNumeTeren()).updateChildren(mapOre);
                                rezervare.setEsteAnulata(false);
                                Toast.makeText(view.getContext(), "Anulare cu succes!", Toast.LENGTH_LONG).show();

                            }
                        }).setNegativeButton(R.string.nu, null).show();

                    }
                });

            }
        });

    }

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


    // i have updated my code with the delete and insert a booking
    public void stergeRezervare(int position){
        rezervari.remove(position);
        notifyDataSetChanged();
    }

    public void adaugaRezervare(Rezervare rezervare){
        rezervari.add(rezervare);
        notifyDataSetChanged();
    }

这是让我从 firebase 获得预订的功能 我有 3 个单独的有效预订列表、已取消预订和过去预订。

public interface RezervariListCallback {
        void onCallback(List<Rezervare> rezervariActuale, List<Rezervare> rezervariTrecute, List<Rezervare> rezervariAnulate);
    }

    public void getRezervari(String nume, RezervariListCallback myCallback){
        reff.child("Users").child(nume).child("rezervari").addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                for(DataSnapshot data : snapshot.getChildren()){
                    String dataRezervare = data.getKey();
                    dateRezervari.add(dataRezervare);

                    reff.child("Users").child(nume).child("rezervari").child(dataRezervare).addListenerForSingleValueEvent(new ValueEventListener() {
                       @Override
                       public void onDataChange(@NonNull DataSnapshot snapshot) {
                            for(DataSnapshot data : snapshot.getChildren()){
                                String numeTeren = data.getKey();

                                reff.child("Users").child(nume).child("rezervari").child(dataRezervare).child(numeTeren).child("ore").addValueEventListener(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                                        List<String> ore = new ArrayList<>();
                                        for(DataSnapshot data : snapshot.getChildren()){
                                            String ora = data.getKey();
                                            ore.add(ora);
                                        }

                                        getAdresa(nume, dataRezervare, numeTeren, new AdresaCallback() {
                                            @Override
                                            public void onCallbackAdresa(String value) {
                                                Rezervare rezervare = new Rezervare(numeTeren, ore, dataRezervare, value);
                                                String dataAzi = getDataAzi();

                                                reff.child("Users").child(nume).child("rezervari").child(dataRezervare).child(numeTeren).child("status").addValueEventListener(new ValueEventListener() {
                                                    @Override
                                                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                                                        String status = (String) snapshot.getValue();

                                                        if(comparaData(dataAzi, rezervare.getData())){
                                                            if(status.equals("activa")){
                                                                rezervariActive.add(rezervare);
                                                            } else {
                                                                rezervariAnulate.add(rezervare);
                                                            }
                                                        } else {
                                                            rezervariTrecute.add(rezervare);
                                                        }

                                                        myCallback.onCallback(rezervariActive, rezervariTrecute, rezervariAnulate);
                                                    }

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

                                                    }
                                                });
                                            }
                                        });


                                    }

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

                                    }
                                });
                            }
                       }

                       @Override
                       public void onCancelled(@NonNull DatabaseError error) {
                       }
                    });
                }
            }

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

            }
        });
    }

这是我设置适配器的地方

 public void updateRezervari(View view, RecyclerView activeBookingsRecycler, RecyclerView pastBookingsRecycler, RecyclerView cancelledBookingsRecycler){
        AsyncTask.execute(new Runnable() {
            @Override
            public void run() {
                getRezervari(numeUtilizator, new RezervariListCallback() {
                    @Override
                    public void onCallback(List<Rezervare> rezervariActuale, List<Rezervare> rezervariTrecute, List<Rezervare> rezervariAnulate) {
                        if(rezervariActuale.size()>0){
                            tvFaraRezervariActive.setEnabled(false);
                            tvFaraRezervariAnulate.setEnabled(false);
                            tvFaraRezervariTrecute.setEnabled(false);
                        }

                        Log.v("rezAc", rezervariActuale.toString());
                        Log.v("rezTr", rezervariTrecute.toString());

                        RecyclerViewAdapterRezervare adapter = new RecyclerViewAdapterRezervare(rezervariActuale, view.getContext(), numeUtilizator);
                        activeBookingsRecycler.setAdapter(adapter);
                        adapter = new RecyclerViewAdapterRezervare(rezervariTrecute, view.getContext(), numeUtilizator);
                        pastBookingsRecycler.setAdapter(adapter);
                        adapter = new RecyclerViewAdapterRezervare(rezervariAnulate, view.getContext(), numeUtilizator);
                        cancelledBookingsRecycler.setAdapter(adapter);
                    }
                });
            }
        });
    }

您能给我一些关于如何从一个回收站视图转移到另一个视图的提示吗?谢谢!

【问题讨论】:

  • Can you give me a few tips on how to move from one recycler view to another? recyclerviews 由适配器控制。从一个适配器中删除,添加到另一个适配器,通知适配器数据已更改
  • 您的代码中发生了很多事情,因此很难调试所有这些代码行。一个涵盖另一种(个人)方法的答案会帮助你实现同样的目标吗?请回复@AlexMamo
  • @AlexMamo 我已经编辑了我的帖子,我希望现在更容易关注。

标签: java android firebase firebase-realtime-database android-recyclerview


【解决方案1】:

由于您使用 Firebase 获取预订状态,您可以在 Firebase 数据库中将状态更新为已取消,然后您会从 Firebase 侦听器收到回调,您可以在其中更新您的数组列表并调用 notifyDataSetChanged()。

【讨论】:

  • 我真的不知道该怎么做。我确实有一个代码,可以在我每次取消预订时检索预订,但这需要很长时间,而且它没有让我到达我想要的地方。我制作了一个视频:streamable.com/flvjxo,它展示了它是如何工作的。基本上,当我取消预订时,它会将我带到足球场片段,我不希望那样。我可以从活动预订中删除,但我不知道如何添加到已取消的预订中,因此它会立即生效。
  • 您能否分享您在适配器类中调用这些添加和删除预订方法的代码?
  • 好吧,我不调用这些方法,因为我不知道在哪里调用它们。我有一个“配置文件”片段,其中我有recyclerviews,在片段中我调用方法从firebase获取预订,然后我只需使用相应的预订列表设置每个适配器。我已经用设置适配器的方法更新了我的帖子,并让我获得了 Firebase 预订。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多