简体   繁体   English

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

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

Hi, I faced an issue here.. I was creating a chatbot in which user can type a text to send it and also can select a text out of the recommended texts嗨,我在这里遇到了一个问题。我正在创建一个聊天机器人,用户可以在其中输入文本来发送它,也可以 select 推荐文本中的文本

在此处输入图像描述

so I created two RecycleViews所以我创建了两个 RecycleViews

在此处输入图像描述

My goal is - when the user selects one of the recommended text, then that text should appear in the Chatting RecycleView我的目标是 - 当用户选择推荐文本之一时,该文本应出现在聊天 RecycleView 中

在此处输入图像描述

here is my main Activity Class这是我的主要活动 Class

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}));
    }
}

here is my Adapter class class codes这是我的适配器 class class 代码

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);
        }
    }

}

You can add a list of your recommendations in another RecyclerView Then in the ViewHolder of each item of the RecyclerView add Callback to listen on click events when a user clicks one of the item like the following您可以在另一个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);
    }
}

Now inside your adapter add the callback from viewholder现在在你的适配器中添加来自 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);
    }
}

After that, now on your Activity you can easily listen on any item when a user clicks and get its corresponding Texts object from list as following:之后,现在在您的Activity上,当用户单击并从列表中获取其相应的Texts object 时,您可以轻松地收听任何项目,如下所示:


//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 ...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何使用嵌套JSON从一个RecyclerView项目发送数据以加载另一个RecyclerView - How to send data From One RecyclerView Item to load another RecyclerView using Nested JSON 单击recyclerview上的项目时的多个数据 - Multiple data when clicked item on recyclerview 在recyclerview中单击项目时获取数据 - get the data when an Item is clicked in recyclerview 单击项目时将数据从 RecyclerView 传递到 Fragment - Passing Data from RecyclerView to Fragment when Item is Clicked 单击recyclerView Item时如何将数据获取到webView活动中 - how to get data into webView activity when recyclerView Item is clicked 单击RecyclerView项时发生NullPointerException - NullPointerException when RecyclerView item is clicked 从一个 recyclerview 中删除一个项目并将其添加到另一个 - remove an item from one recyclerview and add it to another 如何在android中的另一个RecyclerView中将RecyclerView(使用从API获取的数据)显示为列表项? - How to show a RecyclerView (with data fetched from API) as a list item in another RecyclerView in android? 在另一个片段中更改数据时如何刷新一个片段中的RecyclerView - How to refresh RecyclerView in one fragment when data changed in another fragment 单击过滤的 RecyclerView 项时显示错误数据 - Showing wrong data when filtered RecyclerView item is clicked
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM