单击属于RecyclerView内的CardView的ImageButton [英] Click an ImageButton which belongs to a CardView inside a RecyclerView
问题描述
已解决
我已经修复了它的混合答案,所以我决定在这里写下。
关键是 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 $ c $的主要代码c>:
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 ImageButton
have 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屋!
查看全文