单击属于RecyclerView内的CardView的ImageButton [英] Click an ImageButton which belongs to a CardView inside a RecyclerView

查看:213
本文介绍了单击属于RecyclerView内的CardView的ImageButton的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

已解决



我已经修复了它的混合答案,所以我决定在这里写下。



关键是 ViewHolder 构造函数:

我已经删除 setOnClickListener() onClick()方法,我在<$ c $中定义了这个内部类c> ObjectAdapter.java 。

  public static class ViewHolder extends RecyclerView.ViewHolder {

public ViewHolder(查看itemView){
super(itemView);
card_first_btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
int position = getAdapterPosition();
Toast。 makeText(v.getContext(),object.get(position).getName(),Toast.LENGTH_SHORT).show();
}
});
card_second_btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Toast.makeText(v.getContext(),Forward button ,Toast.LENGTH_SHORT).show();
}
});
}
}

这就是全部。

ObjectFragment.java 是:

  public class ObjectFragment extends Fragment {
$ b $ public void ObjectFragment(){
//必需的空公共构造函数
}

@Override
public查看onCreateView(LayoutInflater layoutInflater,ViewGroup容器,Bundle savedInstanceState){
//膨胀此片段的布局
return layoutInflater.inflate (R.layout.fragment_object,container,false);
}

@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);

final ArrayList< Object> objects = initializeList();

if(!objects.isEmpty()){
RecyclerView recyclerView =(RecyclerView)getActivity()。findViewById(R.id.objects_recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(新的LinearLayoutManager(getActivity()));
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.addItemDecoration(new SimpleDivider(getActivity()。getApplicationContext()));

final ObjectAdapter objectAdapter = new ObjectAdapter(objects,R.layout.card_object);
recyclerView.setAdapter(objectAdapter);
}
}

private ArrayList< Object> initializeList(){
ArrayList< Object> objects = new ArrayList<>();
objects.add(new Object(...));
返回对象;
}
}

非常感谢你们。






原始问题

c $ c> RecyclerView ,其中包含一些 CardViews 。这个 CardViews 有两个不同的 ImageButton ,当你点击它们时(明显)会做出不同的事情。



以下是 card_object.xml

 < android.support.v7.widget.CardView 
xmlns:android =http://schemas.android.com/apk/res/android
xmlns:card_view =http:/ /schemas.android.com/apk/res-auto
android:layout_width =match_parent
android:layout_height =wrap_content
android:id =@ + id / object_card
card_view:cardCornerRadius =2dp
card_view:cardElevation =2dp
card_view:cardBackgroundColor =@ color / colorPrimary
android:clickable =true>

< LinearLayout
android:layout_height =match_parent
android:layout_width =match_parent
android:orientation =vertical
android:背景= @颜色/ colorPrimary >

android:layout_width =wrap_content
android:layout_height =wrap_content
android:id =@ + id / object_card_first_button
android:src =@ drawable / contact_100px
android:maxHeight =25dp
android:maxWidth =25dp
android:adjustViewBounds =true
android :scaleType =centerCrop
android:background =@ color / transparentBackgroundPrimary
android:layout_marginRight =54dp
android:layout_marginEnd =54dp/>

android:layout_width =wrap_content
android:layout_height =wrap_content
android:src =@ drawable / forward_100px
android:maxHeight =25dp
android:maxWidth =25dp
android:adjustViewBounds =true
android:scaleType =centerCrop
android:background = @ color / transparentBackgroundPrimary
android:id =@ + id / object_card_second_button/>
< / LinearLayout>
< /android.support.v7.widget.CardView>

这是我的 ObjectAdapter.java

  public class ObjectAdapter 
extends RecyclerView.Adapter< ObjectAdapter.ViewHolder>
实现了View.OnClickListener {

private ArrayList< Object>对象;
private int itemLayout;
私人View.OnClickListener onClickListener;

public ObjectAdapter(ArrayList< Object> objects,int itemLayout){
this.objects = objects;
this.itemLayout = itemLayout;

$ b @Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup,int i){
View view = LayoutInflater.from(viewGroup.getContext())
.inflate(itemLayout,viewGroup,false);

view.setOnClickListener(this);

返回新的ViewHolder(view);
}

public void setOnClickListener(View.OnClickListener listener){
this.onClickListener = listener;

$ b $ public void onClick(View view){
if(onClickListener!= null){
onClickListener.onClick(view);




$ b我的 ObjectFragment.java 是下一个:


  public class ObjectFragment extends Fragment {

public void ObjectFragment(){
//必需的空公共构造函数

$ b @Override
public View onCreateView(LayoutInflater layoutInflater,ViewGroup container Bundle savedInstanceState){
//膨胀这个片段的布局
return layoutInflater.inflate(R.layout.fragment_object,container,false);
}

@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);

final ArrayList< Object> objects = initializeList();

if(!objects.isEmpty()){
RecyclerView recyclerView =(RecyclerView)getActivity()。findViewById(R.id.objects_recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(新的LinearLayoutManager(getActivity()));
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.addItemDecoration(new SimpleDivider(getActivity()。getApplicationContext()));

final ObjectAdapter objectAdapter = new ObjectAdapter(objects,R.layout.card_object);
objectAdapter.setOnClickListener(new View.OnClickListener(){
@Override $ b $ public void onClick(View v){
//这里我可以管理我的Object属性
//但是没有ImageButton自己
}
});

recyclerView.setAdapter(objectAdapter);
}
}

private ArrayList< Object> initializeList(){
ArrayList< Object> objects = new ArrayList<>();
objects.add(new Object(...));
返回对象;
}
}

我可以获取 Object attributes(name,title,whatever),然后点击 CardView 等等,但是我无法做到这一点 ImageButton 拥有自己的onClick。



我不知道是否可以使用 android:onClick()来显示a特定的卡,但这是另一回事。

所以我的问题是我怎样才能让这两个按钮有自己的 OnClickListener ,在那里我应该声明它,以及在这之后如何处理 RecyclerView 中每个项目的信息(这个部分几乎可以实现)。



任何想法?非常感谢!

解决方案

你可以在你的ViewHolder类中添加按钮事件点击。

  public class RecyclerViewHolders extends RecyclerView.ViewHolder implements View.OnClickListener {

public ButtonImage firstButton;
public ButtonImage secondButton;

public RecyclerViewHolders(View itemView){
super(itemView);
itemView.setOnClickListener(this);
firstButton =(ImageButton)itemView.findViewById(R.id.object_card_first_button);
firstButton =(ImageButton)itemView.findViewById(R.id.object_card_second_button);
}

@Override
public void onClick(View view){
int id = view.getId();
switch(id){
case R.id.object_card_first_button:
//按钮事件
break;
案例R.id.object_card_second_button
//按钮事件
break;

}

}


SOLVED

I've fixed it mixing your answers, so I've decided to write down on here.

The key has been the ViewHolder constructor:

I have deleted the setOnClickListener() and the onClick() methods and I´ve defined this inner class in my ObjectAdapter.java.

public static class ViewHolder extends RecyclerView.ViewHolder{

     public ViewHolder(View itemView) {
            super(itemView);
            card_first_btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = getAdapterPosition();
                    Toast.makeText(v.getContext(), object.get(position).getName(), Toast.LENGTH_SHORT).show();
                }
            });
            card_second_btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(v.getContext(), "Forward button", Toast.LENGTH_SHORT).show();
                }
            });
     }
}

And that´s all. The rest of the class is the same.

The ObjectFragment.java is:

public class ObjectFragment extends Fragment {

    public void ObjectFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater layoutInflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this Fragment
        return layoutInflater.inflate(R.layout.fragment_object, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        final ArrayList<Object> objects = initializeList();

        if(!objects.isEmpty()) {   
            RecyclerView recyclerView = (RecyclerView) getActivity().findViewById(R.id.objects_recyclerView);
            recyclerView.setHasFixedSize(true);
            recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
            recyclerView.setItemAnimator(new DefaultItemAnimator());
            recyclerView.addItemDecoration(new SimpleDivider(getActivity().getApplicationContext()));

            final ObjectAdapter objectAdapter = new ObjectAdapter(objects, R.layout.card_object);    
            recyclerView.setAdapter(objectAdapter);
        }
    }

    private ArrayList<Object> initializeList() {
        ArrayList<Object> objects= new ArrayList<>();    
        objects.add(new Object(...));    
        return objects;
    }
}

Thank you very much guys.


Original question

I have a RecyclerView which contains some CardViews. This CardViews have two different ImageButton which make different things when you click them (obvious).

Here is the card_object.xml

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/object_card"
    card_view:cardCornerRadius="2dp"
    card_view:cardElevation="2dp"
    card_view:cardBackgroundColor="@color/colorPrimary"
    android:clickable="true">

    <LinearLayout
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:background="@color/colorPrimary">

        <ImageButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/object_card_first_button"
                android:src="@drawable/contact_100px"
                android:maxHeight="25dp"
                android:maxWidth="25dp"
                android:adjustViewBounds="true"
                android:scaleType="centerCrop"
                android:background="@color/transparentBackgroundPrimary"
                android:layout_marginRight="54dp"
                android:layout_marginEnd="54dp"/>

        <ImageButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/forward_100px"
                android:maxHeight="25dp"
                android:maxWidth="25dp"
                android:adjustViewBounds="true"
                android:scaleType="centerCrop"
                android:background="@color/transparentBackgroundPrimary"
                android:id="@+id/object_card_second_button" />
    </LinearLayout>
</android.support.v7.widget.CardView>

This is the main code of my ObjectAdapter.java:

public class ObjectAdapter 
        extends RecyclerView.Adapter<ObjectAdapter.ViewHolder> 
        implements View.OnClickListener {

    private ArrayList<Object> objects;
    private int itemLayout;
    private View.OnClickListener onClickListener;

    public ObjectAdapter(ArrayList<Object> objects, int itemLayout) {
        this.objects = objects;
        this.itemLayout = itemLayout;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext())
                .inflate(itemLayout, viewGroup, false);

        view.setOnClickListener(this);

        return new ViewHolder(view);
    }

    public void setOnClickListener(View.OnClickListener listener) {
        this.onClickListener = listener;
    }

    public void onClick(View view) {
        if(onClickListener != null) {
        onClickListener.onClick(view);
    } 
}

My ObjectFragment.java is the next:

public class ObjectFragment extends Fragment {

    public void ObjectFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater layoutInflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this Fragment
        return layoutInflater.inflate(R.layout.fragment_object, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        final ArrayList<Object> objects = initializeList();

        if(!objects.isEmpty()) {   
            RecyclerView recyclerView = (RecyclerView) getActivity().findViewById(R.id.objects_recyclerView);
            recyclerView.setHasFixedSize(true);
            recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
            recyclerView.setItemAnimator(new DefaultItemAnimator());
            recyclerView.addItemDecoration(new SimpleDivider(getActivity().getApplicationContext()));

            final ObjectAdapter objectAdapter = new ObjectAdapter(objects, R.layout.card_object);
            objectAdapter.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // Here I can manage my Object attributes,
                    // but no the ImageButtons itselves
                }
            });

            recyclerView.setAdapter(objectAdapter);
        }
    }

    private ArrayList<Object> initializeList() {
        ArrayList<Object> objects= new ArrayList<>();    
        objects.add(new Object(...));    
        return objects;
    }
}

I can obtain the values of the Object attributes (name, title, whatever), and click on the CardView and so on, but I'm not able to make that the ImageButtonhave their own onClick.

I don't know if using android:onClick() it would be possible to display the information of a specific card, but this is another thing.

So my question is how can I make that this two buttons do have their own OnClickListener, where I should declare it and how can handle the information of each item of the RecyclerView after that (this part is almost achieved).

Any idea? Thanks a lot!

解决方案

You can add the button event clicks in your ViewHolder class like this.

public class RecyclerViewHolders extends RecyclerView.ViewHolder implements View.OnClickListener{

public ButtonImage firstButton;
public ButtonImage secondButton;

public RecyclerViewHolders(View itemView) {
    super(itemView);
    itemView.setOnClickListener(this);
    firstButton = (ImageButton)itemView.findViewById(R.id.object_card_first_button);
    firstButton = (ImageButton)itemView.findViewById(R.id.object_card_second_button);
}

@Override
public void onClick(View view) {
 int id = view.getId();
 switch (id){
       case R.id.object_card_first_button:
       // button event
       break;
       case R.id.object_card_second_button
       // button event
       break;

 }

}

这篇关于单击属于RecyclerView内的CardView的ImageButton的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆