【问题标题】:Android: Pass text from Textview when clicking an Image button inside recycler viewAndroid:单击回收站视图中的图像按钮时,从 Textview 传递文本
【发布时间】:2020-04-24 13:26:01
【问题描述】:

所以我有一个带有 2 个文本和 1 个图像按钮的回收站视图。我想单击图像按钮,然后打开一个新活动并将文本从textViewADV1 转移到下一个活动

我的 recyclerview 中的项目 .xml 包含以下内容

 <ImageButton
        android:id="@+id/imageButton1"
        android:clickable="true"
        android:onClick="openActivity2"/>

    <TextView
        android:id="@+id/textViewADV1"
        android:text="Line 1"/>

    <TextView
        android:id="@+id/textViewADV2"
        android:text="Line 2"/>

主活动中的我的 openActivity2()

public void openActivity2(View view)
        {
            Intent intentLoadNewActivity = new Intent(AdvancedResults.this,OpenSelectedAdvanced.class);
            startActivity(intentLoadNewActivity);
        }

我尝试过textViewADV1.getText().toString(),但它只读取回收站视图中第一项的文本

我的回收适配器

public class AdvancedAdapter extends RecyclerView.Adapter<AdvancedAdapter.AdvancedViewHolder> {
    private ArrayList<AdvancedItem> mAdvancedList;

公共字符串 mImage;

    public static class AdvancedViewHolder extends RecyclerView.ViewHolder {
        public ImageButton mImagebtn;
        public TextView mTextView1;
        public TextView mTextView2;

        public AdvancedViewHolder(View itemView) {
            super(itemView);
            mImagebtn = itemView.findViewById(R.id.imageButtonADV);
            mTextView1 = itemView.findViewById(R.id.textViewADV1);
            mTextView2 = itemView.findViewById(R.id.textViewADV2);
        }
    }

    public AdvancedAdapter(ArrayList<AdvancedItem> advancedList) {
        mAdvancedList = advancedList;
    }

    @Override
    public AdvancedViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.advanced_item, parent, false);
        AdvancedViewHolder evh = new AdvancedViewHolder(v);
        return evh;
    }

    @Override
    public void onBindViewHolder(AdvancedViewHolder holder, int position) {
        AdvancedItem currentItem = mAdvancedList.get(position);
        holder.mTextView1.setText(currentItem.getText1());
        holder.mTextView2.setText(currentItem.getText2());
        mImage = "www.testImageURL.com";
        Picasso.get().load(mImage).into(holder.mImagebtn);
    }

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

【问题讨论】:

    标签: android android-layout android-recyclerview android-xml


    【解决方案1】:

    首先在初始化时将context 传递给您的adapter

    //in the main activity that you initialize the adapter in
    
    AdvancedAdapter adapter = new AdvancedAdapter(your_list , MainActivity.this);
    

    现在将AdvancedAdapter的构造函数改为接受context

     public class AdvancedAdapter extends RecyclerView.Adapter<AdvancedAdapter.AdvancedViewHolder> {
    
    private ArrayList<AdvancedItem> mAdvancedList;
    
    private Context context;
    
    .............
    
    //constructor
    
    public AdvancedAdapter(ArrayList<AdvancedItem> advancedList,Context context) {
    mAdvancedList = advancedList;
    this.context = context;
    }
    

    现在在onBindViewHolderAdvancedAdapter

    @Override
    public void onBindViewHolder(AdvancedViewHolder holder, int position) {
    AdvancedItem currentItem = mAdvancedList.get(position);
    holder.mTextView1.setText(currentItem.getText1());
    holder.mTextView2.setText(currentItem.getText2());
    mImage = "www.testImageURL.com";
    Picasso.get().load(mImage).into(holder.mImagebtn);
    
    //on click image button
    
    hodler.mImagebtn.setOnclickListener(new View.OnClickListener(){
    
    @Override
    public void onClick(View view){
    
    Intent intent = new Intent(context , OpenSelectedAdvanced.class);
    intent.putExtra("data" , currentItem.getText1());
    context.startActivity(intent);
    }
    
    });
    
    }
    

    OpenSelectedAdvanced活动中获取数据:

    //in oncreate method:
    
    Intent intent = getIntent();
    
    //this is your text view text that came from the clicked image button
    String transferedText = intent.getStringExtra("data");
    

    【讨论】:

      【解决方案2】:

      如果您在适配器类中声明了 onBindViewHolder(),那么为什么要从 MainActivity 开始活动。您应该在 onBindViewHolder() 中添加 setOnclicklistenr() 以通过以下方式实现所需的结果:

      public class AdvancedAdapter extends RecyclerView.Adapter<AdvancedAdapter.AdvancedViewHolder> {
      private ArrayList<AdvancedItem> mAdvancedList;
      //one more thing you have to create Context field so that you can
       //you can start the activity from any context (From Any activity)
       private Context mContext;
      
        public String mImage;
      
      public static class AdvancedViewHolder extends RecyclerView.ViewHolder        {
          public ImageButton mImagebtn;
          public TextView mTextView1;
          public TextView mTextView2;
      
          public AdvancedViewHolder(View itemView) {
              super(itemView);
              mImagebtn = itemView.findViewById(R.id.imageButtonADV);
              mTextView1 = itemView.findViewById(R.id.textViewADV1);
              mTextView2 = itemView.findViewById(R.id.textViewADV2);
          }
      }
      
      public AdvancedAdapter(ArrayList<AdvancedItem> advancedList, Context mContext) {
          mAdvancedList = advancedList;
          this.mContext = mContext;
      }
      
      @Override
      public AdvancedViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
          View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.advanced_item, parent, false);
          AdvancedViewHolder evh = new AdvancedViewHolder(v);
          return evh;
      }
      
      @Override
      public void onBindViewHolder(AdvancedViewHolder holder, int position) {
          AdvancedItem currentItem = mAdvancedList.get(position);
          holder.mTextView1.setText(currentItem.getText1());
          holder.mTextView2.setText(currentItem.getText2());
          mImage = "www.testImageURL.com";
          holder.mImage.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  // Here You start your activity
                  Intent intent = new Intent(mContext, Activity2.class);
                  //you can putExtras here
                  mContext.startActivity(intent);
          });
          Picasso.get().load(mImage).into(holder.mImagebtn);
      }
      
      @Override
      public int getItemCount() {
          return mAdvancedList.size();
      }
         }
      

      现在在您实现 recyclerView 的活动中初始化此适配器,并将该数组列表发送到适配器的构造函数的参数中:) 如果还不明白,您可以尝试下面给出的链接上的教程:https://www.youtube.com/watch?v=bIppSKk9afI

      【讨论】:

      • 我希望从主要活动中更容易做到这一点,如果有帮助,我已经添加了我的适配器
      • 然后如何使用位置从 TextView 获取文本?
      • 您正在使用 Arraylist 设置 textView 使用此发送。
      • AdvancedItem 有 Constructor 和 getter 和 setter 吗?如果你是初学者,那么首先尝试去学习一个教程,你可以去链接或者你可以谷歌学习教程。
      猜你喜欢
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多