解决了

我们已经解决了混合您的答案的问题,因此决定在这里写下。

关键是ViewHolder构造函数:

我删除了setOnClickListener()onClick()方法,并在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();
                }
            });
     }
}

就这样。其余的 class 是相同的。
ObjectFragment.java是:
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;
    }
}

非常感谢你们。

原始问题

我有一个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: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>

这是我的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);
    }
}

我的ObjectFragment.java是下一个:
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;
    }
}

我可以获取Object属性的值(名称,标题等),然后单击CardView等,但是我无法使ImageButton具有自己的onClick。

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

所以我的问题是,如何使这两个按钮具有自己的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:
       // button event
       break;
       case R.id.object_card_second_button
       // button event
       break;

 }

}

07-28 02:14
查看更多