2017-12-06 3 views
0

Ich möchte meine RecyclerView Artikelhintergrund mit wechselnder Farbe ändern.RecyclerView Artikel Hintergrund wechselnde Farbe außer Betrieb

Hier ist die Methode in Adapter.

public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder> { 
private List<NewsModel> mNewsList; 

class ViewHolder extends RecyclerView.ViewHolder { 
    TextView newsNameText; 
    TextView newsDataText; 
    View listView; 
    public ViewHolder(View newsView) { 
     super(newsView); 
     newsNameText = (TextView) newsView.findViewById(R.id.news_Name); 
     newsDataText = (TextView) newsView.findViewById(R.id.news_Data); 
     listView = newsView; 
    } 
} 
public NewsAdapter(List<NewsModel> newsList) { 
    mNewsList = newsList; 
} 
@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.news_item, parent, false); 
    final ViewHolder holder = new ViewHolder(view); 
    return holder; 
} 
public void setData(List<NewsModel> viewData) { 
    mNewsList.clear(); 
    mNewsList.addAll(viewData); 
    notifyDataSetChanged(); 
} 

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    NewsModel news = mNewsList.get(position); 
    holder.setIsRecyclable(true); 
    if(position % 2 == 0){ 
     holder.listView.setBackgroundColor(0x80E0EEEE); 
    } 
    holder.newsNameText.setText(news.getName()); 
    holder.newsDataText.setText(news.getData()); 
} 
@Override 
public int getItemCount() { 
    return mNewsList.size(); 
} 

}

Das Problem ist, wenn ich den Bildschirm berühren und nach unten wischen mehr Artikel zu sehen, die das Element Farbe Hintergrund in der falschen Reihenfolge werden. Es ist nicht alternierend.

Bin ich falsch bei der Verwendung dieser Methode?

Danke!

Antwort

1

Es ist, weil RecyclerView Ihre alten Ansichten rezykliert neue Ansichten zu erstellen. Wenn Sie nach unten scrollen, werden die alten Ansichten verwendet, um die neuen zu erstellen. Da die Hintergrundfarbe dieser alten Ansichten bereits festgelegt wurde, wenn onBindViewHolder aufgerufen wurde, müssen Sie die else-Bedingung in onBindViewHolder angeben, die die Farbe ändert und die alternierende Farbe beibehält Auftrag. Ändern Sie Ihren onBindViewHolder Code zu diesem:

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    NewsModel news = mNewsList.get(position); 
    holder.setIsRecyclable(true); 
    if(position % 2 == 0){ 
     holder.listView.setBackgroundColor(0x80E0EEEE); 
    }else{ 
     holder.listview.setBackgroundColor(#FFFFFF); 
    } 
    holder.newsNameText.setText(news.getName()); 
    holder.newsDataText.setText(news.getData()); 
} 
+0

Danke. Es klappt. Die Farbe sollte (0XFFFFFF) sein. –

0

versuchen diese

NewsModel news = mNewsList.get(getAdapterPosition()); 
holder.setIsRecyclable(true); 
if(getAdapterPosition() % 2 == 0){ 
    holder.listView.setBackgroundColor(0x80E0EEEE); 
}else{ 
    holder.listView.setBackgroundColor(000000); // use default color 
}