单击第一个 RecyclerView 中的项目时,如何将数据从一个 RecyclerView 流向另一个 RecyclerView?

How to flow Data from One RecyclerView to Another RecyclerView when an item in first RecyclerView is clicked?

嗨,我在这里遇到了一个问题。我正在创建一个聊天机器人,用户可以在其中输入文本进行发送,也可以 select 推荐文本中的文本

所以我创建了两个 RecycleViews

我的目标是 - 当用户 select 推荐的文本之一时,该文本应该出现在聊天 RecycleView 中

这里是我的主要ActivityClass

public class Charts extends AppCompatActivity {

    private static final String USER_KEY = "user";
    private static final String BOT_KEY = "bot";

    RecyclerView chart_recycle,auto_texts;
    EditText message_text;
    ImageView send_btn,mic_button;
    ImageView setting_button;

    ChartsAdapter chartsAdapter;
    RecyclerView.LayoutManager linearLayout;
    ArrayList<ChartModeClass> modeClassesArrayList = new ArrayList<>();

    AutoAdapter autoAdapter;
    RecyclerView.LayoutManager horizontal;
    List<Texts> list = new ArrayList();


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

        message_text = findViewById(R.id.message_text);
        send_btn = findViewById(R.id.send_btn);
        mic_button = findViewById(R.id.mic_btn);
        setting_button = findViewById(R.id.setting_button);

        chart_recycle = findViewById(R.id.chart_recycle);
        chart_recycle.setHasFixedSize(true);

        auto_texts = findViewById(R.id.auto_texts);
        auto_texts.setHasFixedSize(true);

        linearLayout = new LinearLayoutManager(getApplicationContext(), RecyclerView.VERTICAL, false);
        chart_recycle.setLayoutManager(linearLayout);

        //Auto text
        horizontal = new LinearLayoutManager(getApplicationContext(),RecyclerView.HORIZONTAL, false);
        auto_texts.setLayoutManager(horizontal);

        chartsAdapter = new ChartsAdapter(modeClassesArrayList, Charts.this);
        chart_recycle.setAdapter(chartsAdapter);

        //Auto texts
        autoAdapter = new AutoAdapter(getApplicationContext(),list);
        auto_texts.setAdapter(autoAdapter);
        addInputs();

        BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(Charts.this);
        mic_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                bottomSheetDialog.setContentView(R.layout.record);
                bottomSheetDialog.show();
            }
        });

        message_text.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                if (charSequence.toString().trim().length()==0){
                    mic_button.setVisibility(View.VISIBLE);
                    send_btn.setVisibility(View.GONE);
                }else {
                    send_btn.setVisibility(View.VISIBLE);
                    mic_button.setVisibility(View.GONE);
                }
            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
               if (charSequence.toString().trim().isEmpty()){
//                   Toast.makeText(getApplicationContext(),"Enter text",Toast.LENGTH_LONG).show();
                   mic_button.setVisibility(View.VISIBLE);
                   send_btn.setVisibility(View.GONE);
               }else {
                   send_btn.setVisibility(View.VISIBLE);
                   mic_button.setVisibility(View.GONE);
               }
            }

            @Override
            public void afterTextChanged(Editable editable) {

                if (editable.toString().length()==0){
                    mic_button.setVisibility(View.VISIBLE);
                    send_btn.setVisibility(View.GONE);
                }
            }
        });


        send_btn.setOnClickListener(view -> {
            if (message_text.getText().toString().isEmpty()) {
                Toast.makeText(Charts.this, "Please enter text..", Toast.LENGTH_SHORT).show();
            }

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                returnResponse(message_text.getText().toString());
            }
            message_text.setText("");
        });

    }



    @SuppressLint("NotifyDataSetChanged")
    private void returnResponse(String message) {

        modeClassesArrayList.add(new ChartModeClass(message, USER_KEY));
        chartsAdapter.notifyDataSetChanged();
        chart_recycle.scrollToPosition(modeClassesArrayList.size()-1);

        String url = "http://xxxxxxxxxxxxxxxx"+message;
        String BASE_URL = "https://xxxxxxxxx";
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        RetrofitApi retrofitApi = retrofit.create(RetrofitApi.class);
        Call<MessageModeClass> call = retrofitApi.getMessage(url);

        call.enqueue(new Callback<MessageModeClass>() {
            @Override
            public void onResponse(@NonNull Call<MessageModeClass> call, @NonNull Response<MessageModeClass> response) {
                if (response.isSuccessful()) {
                    MessageModeClass messageModeClass = response.body();
                    if (messageModeClass != null) {
                        modeClassesArrayList.add(new ChartModeClass(messageModeClass.getCnt(), BOT_KEY));
                    }
                    chartsAdapter.notifyDataSetChanged();
                    chart_recycle.scrollToPosition(modeClassesArrayList.size() - 1);

                } else {
                    Toast.makeText(Charts.this, "response is null", Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onFailure(@NonNull Call<MessageModeClass> call, @NonNull Throwable t) {
                modeClassesArrayList.add(new ChartModeClass("No response check your network connection!", BOT_KEY));
                chartsAdapter.notifyDataSetChanged();
                chart_recycle.scrollToPosition(modeClassesArrayList.size() - 1);
            }
        });

    }



    @SuppressLint("NotifyDataSetChanged")
    @Override
    protected void onStart() {
        super.onStart();

        String lang = getIntent().getExtras().getString("lang");
        if (lang.equals("english")){

            modeClassesArrayList.add(new ChartModeClass("Hey welcome back am fema bot", BOT_KEY));
            chartsAdapter.notifyDataSetChanged();
            chart_recycle.scrollToPosition(modeClassesArrayList.size() - 1);

        }else if (lang.equals("swahili")){
            modeClassesArrayList.add(new ChartModeClass("Habari karibu miminni bot niliyetengenezw", BOT_KEY));
            chartsAdapter.notifyDataSetChanged();
            chart_recycle.scrollToPosition(modeClassesArrayList.size() - 1);
        }else {
            modeClassesArrayList.add(new ChartModeClass("Hey welcome back am fema bot", BOT_KEY));
            chartsAdapter.notifyDataSetChanged();
            chart_recycle.scrollToPosition(modeClassesArrayList.size() - 1);
        }

    }


    private void addInputs() {
        Texts text1 = new Texts("gender?");
        Texts text2 = new Texts("gender equality");
        Texts text3 = new Texts("what is good about females");
        Texts text4 = new Texts("un goals");
        Texts text5 = new Texts("about men");

        list.addAll(Arrays.asList(new Texts[]{text1,text2,text3,text4,text5}));
    }
}

这是我的适配器classclass代码

public class AutoAdapter extends RecyclerView.Adapter<AutoAdapter.ViewHolderClass> {
    Context context;
    List<Texts> list;


    public AutoAdapter(Context context, List<Texts> list) {
        this.context = context;
        this.list = list;
    }


    @NonNull
    @Override
    public ViewHolderClass onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.text_list,parent,false);
        ViewHolderClass viewHolderClass = new ViewHolderClass(view);

        return viewHolderClass;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolderClass holder, @SuppressLint("RecyclerView") int position) {
        holder.input_text.setText(list.get(position).getText());

        holder.input_text.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               // my stack
            }
        });
    }


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

    public class ViewHolderClass extends RecyclerView.ViewHolder {

        TextView input_text;

        public ViewHolderClass(@NonNull View itemView) {
            super(itemView);
            input_text = itemView.findViewById(R.id.input_text);
        }
    }

}

您可以在另一个 RecyclerView 中添加您的推荐列表 然后在RecyclerView的每一项的ViewHolder中添加Callback当用户点击其中一项时监听点击事件,如下


public class ViewHolderClass extends RecyclerView.ViewHolder {

    private TextView input_text;
    private final Callback callback; // custom callback

    public ViewHolderClass(@NonNull View itemView, Callback callback) {
        super(itemView);
        this.callback = callback;
        input_text = itemView.findViewById(R.id.input_text);

        // now add onClickListener of the itemView to fire custom callback
        itemView.setOnClickListener(view -> {
           this.callback.onItemClick(getAdapterPosition());
        });
    }

    // this is my custom callback for return click event
    public interface Callback {
       void onItemClick(int position);
    }
}

现在在您的适配器中添加来自 viewholder 的回调


public class AutoAdapter extends RecyclerView.Adapter<AutoAdapter.ViewHolderClass> {
    private Context context;
    private List<Texts> list;
    private AutoAdapterCallback callback;


    public AutoAdapter(Context context, List<Texts> list) {
        this.context = context;
        this.list = list;
    }
    
    public setCallback(AutoAdapterCallback callback) {
        this.callback = callback;
    }

    @NonNull
    @Override
    public ViewHolderClass onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.text_list,parent,false);
        ViewHolderClass viewHolderClass = new ViewHolderClass(view, new ViewHolderClass.Callback() {
        @Override
        public void onItemClick(int position) {
            // forward callback to adapter callback
            if (callback != null) {
               // get actual item from its position
               final Texts texts = getItemByPosition(position);
               // send to adapter callback
               callback.onItemClick(texts);
            }
        });

        return viewHolderClass;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolderClass holder, @SuppressLint("RecyclerView") int position) {
        holder.input_text.setText(list.get(position).getText());

        // I haven't used this inteady I added callback on viewholder side
        // holder.input_text.setOnClickListener(new View.OnClickListener() {
        //     @Override
        //     public void onClick(View view) {
        //        // my stack
        //     }
        // });
    }


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

    // return Texts object by given position
    public Texts getItemByPosition(int position) {
        return this.list.get(position);
    }
    
    // add adapter callback to be called by viewholder
    public interface AdapterCallback {
        void onItemClick(Texts texts);
    }
}

之后,现在在您的 Activity 上,您可以在用户单击时轻松监听任何项目,并从列表中获取其对应的 Texts 对象,如下所示:


//code ...

// here 

//Auto texts
autoAdapter = new AutoAdapter(getApplicationContext(),list);

//set callback to listen for click events
autoAdapter.setCallback(new AutoAdapter.AutoAdapterCallback() {
     @Override
     public void onItemClick(Texts texts) {
        // you can get your clicked item here
        // now you can put texts object to another RecyclerView :)
     }
});

auto_texts.setAdapter(autoAdapter);

//code ...