2016-07-04 5 views
6

처음에는 RecyclerView 항목이 정상이지만 스크롤 할 때 항목이 잘못된 위치에 표시됩니다 (예 : 위치 6에 표시된 항목 6). onClick listener 및 getAdapterPosition()이 올바로 작동하고 올바로 작동하지만 항목. 왜? RecyclerView 잘못된 위치 설정 onBindViewHolder

import android.content.Context; 
import android.graphics.Typeface; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 
import com.neganet.darotabii.R; 
import com.neganet.darotabii.beans.headers_Bean; 
import java.util.List; 
public class FSecAdapter2 extends RecyclerView.Adapter<FSecAdapter2.mViewHolder> { 

    private static List<headers_Bean> items_t; 
    private static int secNo; 
    private Typeface font; 
    private boolean showSoreName; 
    private static Context mContext; 
    private static String сolorString; 

    private static String fSubjectText=""; 
    private static Static_Datas static_datas; 
    private static QDataGetter dataGetter; 

public FSecAdapter2(List<headers_Bean> t_items, Context cnt, int secNo) { 
      setHasStableIds(true); 

      this.mContext=cnt; 
      this.items_t = t_items; 
      this.static_datas=new Static_Datas(mContext); 
      this.secNo=secNo; 
     } 

     public static class mViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
      private OnTitleClickListener titClickListener; 

      static TextView title; 
      public mViewHolder(View itemView) { 
       super(itemView); 
        this.title = (TextView) itemView.findViewById(R.id.title2); 
        this.title.setTypeface(static_datas.get_titr_1_Font()); 
        this.title.setOnClickListener(this); 
        this.titClickListener=(OnTitleClickListener) FSecAdapter2.mContext; 
      } 
      @Override 
      public void onClick(View v) { 
        titClickListener.onTitleClick(v,items_t.get(getAdapterPosition()).serial+"*"+items_t.get(getAdapterPosition()).titr); 
      } 

     } 

     @Override 
     public mViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      View itemView; 
      itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.titles_item, parent, false); 
      mViewHolder mVH=new mViewHolder(itemView); 
      return mVH; 
     } 

     @Override 
     public void onBindViewHolder(mViewHolder holder, int position) { 
      final headers_Bean curHbean=this.items_t.get(position); 
      try { 

       holder.title.setText(static_datas.fa_Ye_Ke(curHbean.titr)); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

     } 

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



     public interface OnTitleClickListener { 
      public void onTitleClick(View v, String serial); 
     } 

    public void updateData(headers_Bean newHead){ 
     items_t.add(items_t.size(),newHead); 
     notifyItemInserted(items_t.size()-1); 
    }} 

및 프래그먼트

:

 mAdapter = new FSecAdapter2(titList,getActivity(),secNo); 
    final LinearLayoutManager mLayoutManager = new LinearLayoutManager(this.getActivity()); 
    mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
    titRecycle.setLayoutManager(mLayoutManager); 
    titRecycle.setItemAnimator(new DefaultItemAnimator()); 
    titRecycle.setAdapter(mAdapter); 
+1

()가'(FALSE) holder.setIsRecyclable을 추가;' –

+0

@ kashyap jimuliya - 고마워. 그것은 작동합니다. RecyclerView의 재활용을 사용하는 다른 방법이 있습니다 – Solivan

+0

'Activity On'에서'interface OnTitleClickListener()'를 구현하고 있습니까? –

답변

23

public void onBindViewHolder()

공개 무효 onBindViewHolder '에서
holder.setIsRecyclable(false); 
+0

이렇게 스크롤 된 항목이 초기 값으로 변경됩니다. – sasan

+0

@sasan,'notify()'메소드를 한 번 확인하거나 더 잘 이해하기 위해 코드를 공유하십시오. –

+1

하지만 항목이 많을 때 recyclerview가 지연됩니다. –