2015-09-24 21 views
6

gì đang xảy ra:RecyclerView mục trùng lặp và liên tục thay đổi

Danh sách (RecyclerView) được trộn lên các dữ liệu khi tôi di chuyển.

I.E khi tôi cuộn lại sau khi cuộn xuống, một số mục danh sách được lặp lại, không hiển thị nội dung phù hợp.

package jamesnguyen.newzyv2.UI_update; 

import android.content.Context; 
import android.support.v7.widget.CardView; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

import java.util.List; 

import jamesnguyen.newzyv2.R; 
import jamesnguyen.newzyv2.RSS_Processcors.RssItem; 

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.FeedViewHolder> { 

    private static List<RssItem> items = null; 
    private static Context context; 

    public RVAdapter(Context context, List<RssItem> items) { 
     this.items = items; 
     this.context = context; 
    } 

    public static List<RssItem> getItems() { 
     return items; 
    } 

    @Override 
    public RVAdapter.FeedViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false); 
     return new FeedViewHolder(v); 
    } 

    @Override 
    public void onBindViewHolder(RVAdapter.FeedViewHolder holder, int position) { 
     FeedViewHolder.getTitle().setText(items.get(position).getTitle()); 
     FeedViewHolder.getPubDate().setText(items.get(position).getPubDate()); 
     //FeedViewHolder.getDescription().setText(items.get(position).getDescription()); 
    } 

    @Override 
    public long getItemId(int id) { 
     return id; 
    } 

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

    @Override 
    public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
     super.onAttachedToRecyclerView(recyclerView); 
    } 

    public static class FeedViewHolder extends RecyclerView.ViewHolder { 
     private static CardView cv; 
     private static TextView title; 
     private static TextView pubDate; 
     private static TextView description; 

     FeedViewHolder(View itemView) { 
      super(itemView); 
      cv = (CardView) itemView.findViewById(R.id.cv); 
      title = (TextView) itemView.findViewById(R.id.title); 
      pubDate = (TextView) itemView.findViewById(R.id.pubDate); 
      //description = (TextView) itemView.findViewById(R.id.description); 
     } 

     public static TextView getTitle() { 
      return title; 
     } 

     public static TextView getPubDate() { 
      return pubDate; 
     } 

     public static TextView getDescription() { 
      return description; 
     } 
    } 
} 

tôi tin rằng có thể một số công trình phải được thực hiện với quá trình tái chế của RecyclerView nhưng không tôi đã cố gắng seesm để làm việc.

Trả lời

4

Sự cố là đối tượng CardViewTextView được khai báo tĩnh bên trong FeedViewHolder. Điều đó có nghĩa là tất cả các cuộc gọi cố gắng đặt tiêu đề trong phương thức onBindViewHolder đều nhấn vào Chế độ xem được tăng cao nhất.

Việc sửa chữa là để loại bỏ các static từ cv, title, pubDate, description, sau đó thực hiện một số setters không tĩnh như:

public void setTitle(String s) { 
    title.setText(s); 
} 

Để được gọi là trong phương pháp onBindViewHolder:

@Override 
public void onBindViewHolder(RVAdapter.FeedViewHolder holder, int position) { 
    holder.setTitle(items.get(position).getTitle()); 
    //... 
} 
+0

Điều này phù hợp với tôi. Các khung nhìn đã được khởi tạo như các đối tượng của lớp ViewHolder và không phải là lớp Adapter. Sau đó, họ phải được gọi từ tham chiếu của đối tượng chủ trong onBindViewHolder –

16

Chỉ có hai thứ trong bộ điều hợp RecyclerView của bạn

@Override 
public long getItemId(int position) { 
    return position; 
} 

và trong constructor của adapter

setHasStableIds(true); 

Hy vọng nó sẽ giúp!

12

hoàn tất.

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public int getItemViewType(int position) { 
    return position; 
} 
6

Ghi đè các phương thức này trong lớp Bộ điều hợp của bạn như thế này.

@Override 
public long getItemId(int position) { 
return position; 
} 

@Override 
public int getItemViewType(int position) { 
return position; 
} 
+0

nhờ @rjdkolb –

Các vấn đề liên quan