2016-06-21 98 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(); 
} 
} 

ItemObject

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

一旦選擇了一行(初始設置爲空),它就會在onClick()中被初始化 - 請參閱'selectedView = view'行' – Zvi

回答

1

這是因爲在回收站查看視圖得到回收。這意味着相同的視圖再次用於顯示其他項目。因此,一旦其他視圖開始使用已選擇的相同視圖,它將開始顯示不正確的結果。

要解決此問題,您必須在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

感謝@Aprit Ratan。有效。缺少的「功能」是View view = holder.itemView; – Zvi

+0

我很高興它幫助:) –