【问题标题】:Add clickListner for button inside a cardView populated using a recyclerView为使用 recyclerView 填充的 cardView 中的按钮添加 clickListner
【发布时间】:2015-04-07 09:27:28
【问题描述】:

我有一个卡片视图

card_contents.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<android.support.v7.widget.CardView android:layout_width="match_parent"
    android:layout_height="150dp"
    android:layout_marginTop="10dp"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    android:id="@+id/card_view">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffa3a4a6">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/card_text"
        android:layout_gravity="center"
        android:gravity="center"
        android:text="B.E"
        android:layout_centerInParent="true"
        />
     <Button
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_alignParentBottom="true"
         android:id="@+id/button1"
         android:layout_toLeftOf="@+id/view"
         android:layout_alignParentLeft="true"
         android:text="2010"
         android:textColor="#000000"
         android:background="@android:color/transparent"
         />
       <View
           android:layout_width="2dp"
           android:layout_height="@dimen/abc_action_button_min_height_material"
           android:layout_centerHorizontal="true"
           android:id="@+id/view"
           android:background="@android:color/black"
           android:layout_alignParentBottom="true"
           />
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/button2"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_toRightOf="@+id/view"
            android:background="@android:color/transparent"
            android:textColor="@android:color/black"
            android:text="2014"/>
    </RelativeLayout>
    </android.support.v7.widget.CardView>
   </RelativeLayout>

MainActivity.class

public class MainActivity extends ActionBarActivity {

RecyclerView recyclerView;

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



    List<String> list=new ArrayList<String>();
    list.add("Hello");
    list.add("Hello World");
    list.add("Hello World Beings");

    recyclerView=(RecyclerView)findViewById(R.id.recycler_view);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setHasFixedSize(true);

    RecyclerView.LayoutManager layoutManager=new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);

    RecyclerView.Adapter adapter=new MyAdapter(list);
    recyclerView.setAdapter(adapter);




}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
}

MyAdapter.class

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
List<String> list;
public MyAdapter(List<String> list){
    this.list=list;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v=LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_contents,viewGroup,false);
    return new MyViewHolder(v);
}

@Override
public void onBindViewHolder(MyViewHolder myViewHolder, int i) {
        myViewHolder.textView.setText(list.get(i));
}

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

public static class MyViewHolder extends RecyclerView.ViewHolder{
    TextView textView;
    MyViewHolder(View view){
        super(view);
        this.textView= (TextView) view.findViewById(R.id.card_text);
    }
}
}

我实际上想为卡片内的按钮设置点击监听器,并根据按下的按钮和按下的卡片启动新的活动。有没有办法做到这一点?我环顾四周,但没有找到为 cardView 内的项目设置点击侦听器的任何答案。我是 android 新手,任何帮助将不胜感激。在此先感谢

【问题讨论】:

  • 另外我想使用相同的适配器来填充其他只有 textviews 的回收器视图。

标签: android ontouchlistener onitemclicklistener android-recyclerview android-cardview


【解决方案1】:

为使用 a 填充的 cardView 内的按钮添加点击侦听器 回收站视图

RecyclerView中的按钮添加点击事件:

1. 从 xml 中获取 Button,方法与 MyViewHolder 类中的 TextView 相同:

public static class MyViewHolder extends RecyclerView.ViewHolder{
    TextView textView;
    Button btnButton1;
    MyViewHolder(View view){
        super(view);
        this.textView= (TextView) view.findViewById(R.id.card_text);
        this.btnButton1= (Button) view.findViewById(R.id.button1);
        ... do same for other Button
    }
}

2.onBindViewHolder方法中为Button添加setOnClickListener方法:

@Override
public void onBindViewHolder(MyViewHolder myViewHolder, int i){
     myViewHolder.textView.setText(list.get(i));
      myViewHolder.btnButton1.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            /// button click event
        }
    });
}

【讨论】:

  • 谢谢,但是如果我想使用相同的适配器来填充只有文本视图的普通回收站视图
  • @user3359069:我认为通常这是不可能的,但你可以通过使用 if-else 条件来做到这一点,显示/隐藏无效的视图。正如我的建议,为其他行设计创建一个单独的适配器,您将通过它开发非常松散耦合的独立模块。谢谢
  • 我怎么知道在哪个recyclerview中按下了按钮?
  • @TomasK 您可以将 i 存储在最终变量中,例如 onBindViewHolder 方法中的最终整数位置,然后在 onClick 方法中使用它。
  • @ρяσѕρєяK 我有一个回收站视图,有 2 个卡片视图,有两个按钮,如何在不影响另一个卡片视图按钮的情况下更改一个卡片视图按钮的文本。我也发布了一个相同的问题,请帮忙这是问题的链接吗stackoverflow.com/questions/40299759/…
【解决方案2】:

在 CustomAdapter 的 onBindViewHolder 方法上定义你的 onClick 监听器。

【讨论】:

    【解决方案3】:

    假设你有:

    <android.support.v7.widget.CardView
        android:id="@+id/cv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="4dp"
        android:elevation="4dp"
        app:cardCornerRadius="2dp">
    
        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:padding="16dp">
    
            <TextView
                android:id="@+id/listText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:padding="8dp"
                android:text="New Text" />
    
            <ImageButton
                android:id="@+id/button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignBottom="@+id/listText"
                android:layout_alignParentRight="true"
                android:onClick="onClickBotonBorrar"
                android:background="?android:selectableItemBackground"
                android:src="@drawable/ic_action_borrar" />
        </RelativeLayout>
    
    </android.support.v7.widget.CardView>
    

    注意这部分:android:onClick="onClickBotonBorrar"

    在您的 Activity 上添加:

    public void onClickBotonBorrar (View v) {
    //Do whatever you want when user clicks on your ImageButton
        }
    

    建议不要在适配器内部而是在 Activity 内部设置 click 事件。

    注意:按钮类似

    【讨论】:

      【解决方案4】:

      另一种方法是使用接口

      1) 创建界面

      public interface ItemClickListener{
      
         public void startSecondActivity(int index);
      
         public void startThirdActivity(int index);
      
      }
      

      2) 在你的Activity中实现接口

      public class MainActivity extends AppcompatActivity implements ItemClickListener {
      
         .........
      
         public void startSecondActivity(int index){
      
                  Intent i = new Intent(MainActivity.this, SecondActivity.class);
                  startActivity(i);
      
         }
      
         public void startThirdActivity(int index){
      
                  Intent i = new Intent(MainActivity.this, ThirdActivity.class);
                  startActivity(i);
         }
      
      
      }
      

      3) 在 RecyclerViewAdapter 中使用 ItemListener

      MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
      
            private ItemListener listener;
      
            public MyAdapter(Context context){
                 listener = (ItemListener)context;
            }
      
            Override
            public void onBindViewHolder(MyViewHolder myViewHolder, int position){
      
               myViewHolder.btnButton1.setOnClickListener(new View.OnClickListener(){
      
                    @Override
                    public void onClick(View v) {
                        listener.startSecondActivity(position)
                    }
               });
      
               myViewHolder.btnButton2.setOnClickListener(new View.OnClickListener(){
      
                    @Override
                    public void onClick(View v) {
                         listener.startThirdActivity(position)
                    }
               });
            }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-22
        • 2018-09-18
        • 2020-09-11
        • 1970-01-01
        相关资源
        最近更新 更多