2016-04-21 90 views
-1

我有一个RecyclerView,它有一个自定义适配器,可以扩展rowLayout。每行包含一个CardView,并在其中包含一些文本和图像作为按钮。特别是我有一个“喜欢”按钮(ImageView),目前只应该改变点击imageResource。RecyclerView滚动进行更改

我可以在onBindViewHolder()方法中设置onClicklistener,它确实注册了我点击按钮的时候,但它不仅改变了那个按钮图像,而且还改变了其他一些像按钮,还有当我向下滚动然后再次起来第一个像按钮有时得到重置。

这是我的适配器代码。

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

    private ArrayList<WallPost> wallPosts; 
    @Override 
    public void onClick(View v) { 

    } 
    public static class ViewHolder extends RecyclerView.ViewHolder { 
     public View view; 
     public ViewHolder(View v) { 
      super(v); 
      view = v; 
     } 
    } 
    public MyAdapter(ArrayList<WallPost> wallPosts) { 
     this.wallPosts = wallPosts; 
    } 
    @Override 
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, 
                int viewType) { 
     View v = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.item_layout, parent, false); 
     ViewHolder vh = new ViewHolder(v); 
     return vh; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, final int position) { 
     TextView name = (TextView) holder.view.findViewById(R.id.person_name); 
     TextView age = (TextView) holder.view.findViewById(R.id.person_age); 
     ImageView profile = (ImageView) holder.view.findViewById(R.id.person_photo); 

     TextView description = (TextView) holder.view.findViewById(R.id.description_text); 
     AppCompatImageView mainImage = (AppCompatImageView) holder.view.findViewById(R.id.main_image); 

     final ImageView likeButton = (ImageView) holder.view.findViewById(R.id.like_button); 

     name.setText(wallPosts.get(position).getName()); 
     age.setText(wallPosts.get(position).getAge()); 
     profile.setImageResource(wallPosts.get(position).getPhotoId()); 

     description.setText(wallPosts.get(position).getDescription()); 
     mainImage.setImageResource(wallPosts.get(position).getMainPhotoId()); 

     likeButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       likeButton.setImageResource(R.drawable.favourite_red); 
      } 
     }); 
    } 

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

这里是项目布局

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/cv" 
    android:layout_marginLeft="8dp" 
    android:layout_marginRight="8dp" 
    android:layout_marginBottom="10dp" 
    card_view:cardCornerRadius="5dp"> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:padding="8dp" 
     > 

     <de.hdodenhof.circleimageview.CircleImageView 
      android:layout_width="48dp" 
      android:layout_height="48dp" 
      android:id="@+id/person_photo" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentTop="true" 
      android:layout_marginRight="16dp" 
      android:src="@drawable/placeholderprofilepic" 
      /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/person_name" 
      android:text="Name" 
      android:layout_toRightOf="@+id/person_photo" 
      android:layout_alignParentTop="true" 
      android:textSize="30sp" 
      /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/person_age" 
      android:text="19" 
      android:layout_toRightOf="@+id/person_photo" 
      android:layout_below="@+id/person_name" 
      /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/description_text" 
      android:text="This is the description of the image" 
      android:layout_below="@id/person_age"/> 


     <android.support.v7.widget.AppCompatImageView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:id="@+id/main_image" 
      android:src="@drawable/placeholderfoodimage" 
      android:layout_below="@+id/description_text" 
      android:elevation="4dp"/> 


     <ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/like_button" 
      android:src="@drawable/favoruite_hollow" 
      android:layout_marginTop="10dp" 
      android:layout_below="@+id/main_image" 
      /> 

    </RelativeLayout> 

</android.support.v7.widget.CardView> 
+0

,请复制粘贴你的'item_layout.xml' 。 –

+0

您认为'RecyclerView'中的* recycler *代表什么? –

+0

@ShadabAnsari我编辑了帖子 – Conviley

回答

0

这是由于意见回收。您需要修改您的getView()方法和做这些事情2 -

  1. 修改您WallPost类有一个标志设置等标志。在onClickListener中设置此标志并更新您的wallPosts数据集。

    wallPosts.get(position).setLike(true);

  2. 设置基于你自己在你的列表中的对象等等标志喜欢/不喜欢的图像资源每次 -

    if(wallPosts.get(position).isLiked()){ likeButton.setImageResource(R.drawable.favourite_red); } else{ likeButton.setImageResource(R.drawable.favoruite_hollow); }

+0

谢谢!这工作就像一个魅力! :D – Conviley

+0

考虑接受答案,如果它为你工作。 –

+0

哦,我的道歉!我在上面! – Conviley