2016-04-21 18 views
-1

RecyclerViewには、rowLayoutを拡張するカスタムアダプタがあります。各行にはCardViewがあり、その中にいくつかのテキストと画像がボタンとして含まれています。特に、私はクリックの際にimageResourceを変更するだけの "好きな"ボタン(ImageView)を持っています。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

関連する問題