首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当单击第一个RecyclerView中的项时,如何将数据从一个RecyclerView流到另一个RecyclerView?

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

Stack Overflow用户
提问于 2022-03-21 05:46:22
回答 1查看 407关注 0票数 0

嗨,我这里有个问题..。我正在创建一个聊天机器人,用户可以在其中输入一个文本来发送它,也可以从推荐的文本中选择一个文本。

,所以我创建了两个RecycleViews

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

这里是我的主要活动类

代码语言:javascript
复制
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}));
    }
}

这里是我的Adapter类代码

代码语言:javascript
复制
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);
        }
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-27 14:26:32

您可以在另一个RecyclerView中添加建议列表,然后在RecyclerView的每个项的ViewHolder中添加Callback,以便在用户单击其中一个项目时监听单击事件,如下所示

代码语言:javascript
复制
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的回调。

代码语言:javascript
复制
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对象时,您可以轻松地侦听任何项目,如下所示:

代码语言:javascript
复制
//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 ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71553254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档