2016-04-21 92 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