Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在使用recyclerView填充的cardView中为按钮添加clickListner_Android_Ontouchlistener_Onitemclicklistener_Android Recyclerview_Android Cardview - Fatal编程技术网

Android 在使用recyclerView填充的cardView中为按钮添加clickListner

Android 在使用recyclerView填充的cardView中为按钮添加clickListner,android,ontouchlistener,onitemclicklistener,android-recyclerview,android-cardview,Android,Ontouchlistener,Onitemclicklistener,Android Recyclerview,Android Cardview,我有一张卡片 卡片内容.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.Card

我有一张卡片

卡片内容.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);
}
}
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);
    }
}
}
公共类MainActivity扩展了ActionBarActivity{
回收视图回收视图;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
列表=新的ArrayList();
添加(“你好”);
添加(“你好世界”);
添加(“你好,世界众生”);
recyclerView=(recyclerView)findViewById(R.id.recycler\u视图);
setItemAnimator(新的DefaultItemAnimator());
recyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager LayoutManager=新的LinearLayoutManager(此);
recyclerView.setLayoutManager(layoutManager);
RecyclerView.Adapter=新的MyAdapter(列表);
recyclerView.setAdapter(适配器);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(右菜单菜单菜单主菜单);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
//处理操作栏项目单击此处。操作栏将
//自动处理Home/Up按钮上的点击,只要
//在AndroidManifest.xml中指定父活动时。
int id=item.getItemId();
//noinspection SimplifiableIf语句
if(id==R.id.action\u设置){
返回true;
}
返回super.onOptionsItemSelected(项目);
}
}
MyAdapter.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);
}
}
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);
    }
}
}
公共类MyAdapter扩展了RecyclerView.Adapter{ 名单; 公共MyAdapter(列表){ this.list=list; } @凌驾 公共MyViewHolder onCreateViewHolder(视图组视图组,int i){ 视图v=LayoutInflater.from(viewGroup.getContext()).flate(R.layout.card_内容,viewGroup,false); 返回新的MyViewHolder(v); } @凌驾 BindViewHolder上的公共无效(MyViewHolder MyViewHolder,int i){ myViewHolder.textView.setText(list.get(i)); } @凌驾 public int getItemCount(){ 返回list.size(); } 公共静态类MyViewHolder扩展了RecyclerView.ViewHolder{ 文本视图文本视图; MyViewHolder(视图){ 超级(视图); this.textView=(textView)view.findViewById(R.id.card\u text); } } } 实际上,我想为卡中的按钮设置click listener,并根据按下的按钮和按下的卡启动新活动。有没有办法做到这一点?我四处查看了一下,但没有找到任何关于设置cardView中项目的点击侦听器的答案。我是android新手,希望您能提供帮助。提前谢谢

在使用 回收视图

将单击事件添加到
RecyclerView
中的按钮,如下所示:

1.从xml中获取按钮,方法与在
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.添加
setOnClickListener
方法,用于
onBindViewHolder中的按钮
方法:

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

在CustomAdapter中的onBindViewHolder方法上定义onClick侦听器。

假设您有:

<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>
建议不要将click事件放在适配器内,而是放在活动内


注意:按钮类似,另一种方法是使用界面

1)创建一个接口

public interface ItemClickListener{

   public void startSecondActivity(int index);

   public void startThirdActivity(int index);

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


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

}
2)在活动中实施界面

public interface ItemClickListener{

   public void startSecondActivity(int index);

   public void startThirdActivity(int index);

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


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

}
3)在RecycleServiceAdapter中使用ItemListener

public interface ItemClickListener{

   public void startSecondActivity(int index);

   public void startThirdActivity(int index);

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


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

}
MyAdapter扩展了RecyclerView.Adapter{ 私有项侦听器; 公共MyAdapter(上下文){ listener=(ItemListener)上下文; } 推翻 BindViewHolder上的公共无效(MyViewHolder MyViewHolder,int位置){ myViewHolder.btnButton1.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图v){ listener.startSecondActivity(位置) } }); myViewHolder.btnButton2.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图v){ listener.startThirdActivity(位置) } }); } }
我还想使用同一适配器来填充其他仅包含文本视图的回收器视图。谢谢。但是如果我想使用同一适配器来填充仅包含文本的正常回收器视图,该怎么办views@user3359069:我认为通常情况下这是不可能的,但您可以通过使用if-else条件、显示/隐藏视图来实现,这是一种无效的方式。根据我的建议,为其他行设计创建一个单独的适配器,通过该适配器,您将开发松散耦合的独立模块。ThanksHow我知道在哪个recyclerview中按下了按钮吗?@TomasK您可以在onBindViewHolder方法中将i存储在最终变量(如最终整数位置)中,然后在onClick中使用它方法。@ρцσρѕρєK我有一个回收器视图,其中两个卡片视图有两个按钮。如何更改一个卡片视图按钮的文本而不影响另一个按钮。我还发布了一个问题。如果可以,请提供帮助。这是问题的链接