2015-09-24 14 views
6

を変更する:私はスクロールするとRecyclerViewアイテム複製し、常に何が起こっているか

リスト(RecyclerView)がデータを取り違えています。

すなわち私はスクロールダウン後に戻ってスクロールしたときに、リスト項目のいくつかは、適切なコンテンツを表示していない、反復されます。

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; 
     } 
    } 
} 

は、私は多分、いくつかの作品はRecyclerViewのリサイクルプロセスで行う必要がありますが、何も私は仕事をするseesmを試していないと信じています。

答えて

4

FeedViewHolder内のオブジェクトは、CardViewTextViewというオブジェクトが静的であると宣言されています。これは、onBindViewHolderメソッドでタイトルを設定しようとしているすべての呼び出しが最新の膨らんだViewにヒットしたことを意味します。

onBindViewHolder方法で呼ばれるように
public void setTitle(String s) { 
    title.setText(s); 
} 

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

これは私のために働いた。ビューはViewHolderクラスのオブジェクトとして初期化され、Adapterクラスは初期化されていませんでした。その後、彼らはonBindViewHolderのホルダーオブジェクトの参照から呼び出されなければならなかった –

16

修正はのようないくつかの非静的セッターを実装し、その後、cvからstaticを削除titlepubDatedescriptionすることですRecyclerViewアダプタの2つのものだけ

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

とアダプタ

setHasStableIds(true); 

のコンストラクタでは、それが役に立てば幸い!

12

完了。

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

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

このように、これらのメソッドをオーバーライドします。

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

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

ありがとう@rjdkolb –

関連する問題