2016-06-21 7 views
1

ユーザーが行をクリックしたときに背景が色を変えるなど、リストの実装を強調表示しようとしています。アプリケーションは正常に動作しますが、リストを上下にスクロールすると、ある行が強調表示されている間に突然他の行も強調表示されます。 次はこの動作を示すテストアプリケーションです(コードはhttp://inducesmile.com/android/how-to-set-recycleview-item-row-background-color-in-android/に基づいています)。RecycleViewが間違った行をハイライト表示する(Android)

主な活動

public class MainActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recycler_view); 
    LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this); 
    recyclerView.setLayoutManager(layoutManager); 

    List<ItemObject> posts = returnListItems(); 

    RecyclerViewAdapter adapter = new RecyclerViewAdapter(MainActivity.this, posts); 
    recyclerView.setAdapter(adapter); 
} 

private List<ItemObject> returnListItems(){ 
    List<ItemObject> items = new ArrayList<ItemObject>(); 
    items.add(new ItemObject("Blank Space", "Taylor Swift", "2016")); 
    items.add(new ItemObject("Uptown Funk", "Mark Ronson", "2016")); 
    items.add(new ItemObject("Can't Feel My Face", "The Weeknd", "2016")); 
    items.add(new ItemObject("Cheerleader", "OMI", "2016")); 
    items.add(new ItemObject("What Do You Mean?", "Justin Bieber", "2016")); 
    items.add(new ItemObject("Hello", "Adele", "2016")); 
    items.add(new ItemObject("Blank Space", "Taylor Swift", "2016")); 
    items.add(new ItemObject("Uptown Funk", "Mark Ronson", "2016")); 
    items.add(new ItemObject("Can't Feel My Face", "The Weeknd", "2016")); 
    items.add(new ItemObject("Cheerleader", "OMI", "2016")); 
    items.add(new ItemObject("What Do You Mean?", "Justin Bieber", "2016")); 
    items.add(new ItemObject("Hello", "Adele", "2016")); 
    items.add(new ItemObject("Blank Space", "Taylor Swift", "2016")); 
    items.add(new ItemObject("Uptown Funk", "Mark Ronson", "2016")); 
    items.add(new ItemObject("Can't Feel My Face", "The Weeknd", "2016")); 
    items.add(new ItemObject("Cheerleader", "OMI", "2016")); 
    items.add(new ItemObject("What Do You Mean?", "Justin Bieber", "2016")); 
    items.add(new ItemObject("Hello", "Adele", "2016")); 
    items.add(new ItemObject("Blank Space", "Taylor Swift", "2016")); 
    items.add(new ItemObject("Uptown Funk", "Mark Ronson", "2016")); 
    items.add(new ItemObject("Can't Feel My Face", "The Weeknd", "2016")); 
    items.add(new ItemObject("Cheerleader", "OMI", "2016")); 
    items.add(new ItemObject("What Do You Mean?", "Justin Bieber", "2016")); 
    items.add(new ItemObject("Hello", "Adele", "2016")); 
    items.add(new ItemObject("Blank Space", "Taylor Swift", "2016")); 
    items.add(new ItemObject("Uptown Funk", "Mark Ronson", "2016")); 
    items.add(new ItemObject("Can't Feel My Face", "The Weeknd", "2016")); 
    items.add(new ItemObject("Cheerleader", "OMI", "2016")); 
    items.add(new ItemObject("What Do You Mean?", "Justin Bieber", "2016")); 
    items.add(new ItemObject("Hello", "Adele", "2016")); 
    return items; 
} 

RecyclerViewHolders

public class RecyclerViewHolders extends RecyclerView.ViewHolder implements View.OnClickListener{ 

public TextView songTitle; 
public TextView songYear; 
public TextView songAuthor; 

private static int selectedPos = -1; 
private static View selectedView = null; 

public RecyclerViewHolders(View itemView) { 
    super(itemView); 
    itemView.setOnClickListener(this); 
    songTitle = (TextView)itemView.findViewById(R.id.song_title); 
    songYear = (TextView)itemView.findViewById(R.id.song_year); 
    songAuthor = (TextView)itemView.findViewById(R.id.song_author); 
} 

@Override 
public void onClick(View view) { 
    int position = getAdapterPosition(); 
    if (selectedPos == position){  // deselect the row 
     selectedView.setSelected(false); 
     selectedPos = -1; // no selected row 
    }else { 
     if (selectedPos != -1) 
      selectedView.setSelected(false);   // deselect the row 
     selectedView = view; 
     selectedPos = position; 
     selectedView.setSelected(true); 
    } 
} 
} 

RecyclerViewAdapter

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewHolders>{ 

private List<ItemObject> itemList; 

public RecyclerViewAdapter(Context context, List<ItemObject> itemList) { 
    this.itemList = itemList; 
} 

@Override 
public RecyclerViewHolders onCreateViewHolder(ViewGroup parent, int viewType) { 
    View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, null); 
    return new RecyclerViewHolders(layoutView); 
} 

@Override 
public void onBindViewHolder(RecyclerViewHolders holder, int position) { 
    holder.songTitle.setText("" + position + " Song Title: " + itemList.get(position).getSongTitle()); 
    holder.songYear.setText("Song Year: " + itemList.get(position).getSongYear()); 
    holder.songAuthor.setText("Song Author: " + itemList.get(position).getSongAuthor()); 
} 

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

public class ItemObject { 

private String songTitle; 
private String songYear; 
private String songAuthor; 

public ItemObject(String songTitle, String songYear, String songAuthor) { 
    this.songTitle = songTitle; 
    this.songYear = songYear; 
    this.songAuthor = songAuthor; 
} 

public String getSongTitle() { 
    return songTitle; 
} 

public String getSongYear() { 
    return songYear; 
} 

public String getSongAuthor() { 
    return songAuthor; 
} 
} 
+0

「RecyclerViewHolders」の完全なコードを投稿しましたか? 'selectedView'がどのように初期化されているのか分かりません。 – jaibatrik

+0

行が選択されると(最初はnullに設定されている)、onClick()で初期化されます - 'selectedView = view'という行を参照してください – Zvi

答えて

1

リサイクラービューにビューが再利用されますので、これはですがItemObject。つまり、同じビューが他のアイテムを表示するために再び使用されます。だから、他のビューが選択された同じビューを使用し始めると、間違った結果が表示され始めます。

これを修正するには、onBindViewHolderコードを変更する必要があります。以下のようなもの:

@Override 
    public void onBindViewHolder(RecyclerViewHolders holder, int position) { 
     View view = holder.getView(); //Please check the appropriate function which returns the "itemView" from view holder. 
     if(position == holder.getSelectedPosition()) //Add a getter method for selected position 
     { 
      view.setSelected(true); 
     } 
     else { 
      view.setSelected(false); 
     } 

     holder.songTitle.setText("" + position + " Song Title: " + itemList.get(position).getSongTitle()); 
     holder.songYear.setText("Song Year: " + itemList.get(position).getSongYear()); 
     holder.songAuthor.setText("Song Author: " + itemList.get(position).getSongAuthor()); 
    } 
+0

Thanks @Aprit Ratan。出来た。欠落している「関数」はView view = holder.itemViewです。 – Zvi

+0

私はそれが助けてうれしいです:) –

関連する問題