2017-09-14 3 views
0

ArrayAdapterを使用してヘッダ付きリストビューを作成しようとしています。ヘッダーには、読み込み時に正常な行の日付が正常に表示されます。私は条件に応じてxmlsに交換しています。しかし、私がそれをスクロールしようとすると、convertViewはnullを返し、時にはnullもありません。なぜこうなった?リストビューカスタムアダプタconvertViewの不一致

private Context context; 
private ArrayList<MapExtension> mapValues; 
private LinkedHashMap<Integer, String> dateLinkedHashMap; 

ListViewAdapter_4(Context context, LinkedHashMap<Integer, MapExtension> mapValues) { 
    super(context, R.layout.custom_listview_layout_3_header, mapValues.keySet().toArray()); 
    this.context = context; 

    this.mapValues= new ArrayList<>(); 
    this.mapValues.addAll(mapValues.values()); 

    this.dateLinkedHashMap = new LinkedHashMap<>(); 
} 

private static class ViewHolder { 
    TextView lblStudentName; 
    TextView lblStudentNumber; 
    TextView lblDateSection; 
} 

@NonNull 
@Override 
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 


    ViewHolder mViewHolder; 
    SimpleDateFormat dateFormat = new SimpleDateFormat("MMM dd, yyyy", Locale.US); 
    String newDateStr = ""; 

    if (convertView == null) { 
     mViewHolder = new ViewHolder(); 

     if (dateLinkedHashMap.size() == 0) { 
      convertView = inflater.inflate(R.layout.custom_listview_layout_3_header, parent, false); 
      mViewHolder.lblDateSection = (TextView) convertView.findViewById(R.id.lblDateSection); 
     } else { 

      newDateStr = dateFormat.format(getDate(mapValues.get(position).getDate())); 

      if (dateLinkedHashMap.containsValue(newDateStr)) { 

       convertView = inflater.inflate(R.layout.custom_listview_layout_3, parent, false); 

       mViewHolder.lblStudentName= (TextView) convertView.findViewById(R.id.lblStudentName); 
       mViewHolder.lblStudentNumber = (TextView) convertView.findViewById(R.id.lblStudentNumber); 

      } else { 
       convertView = inflater.inflate(R.layout.custom_listview_layout_3_header, parent, false); 

       mViewHolder.lblDateSection = (TextView) convertView.findViewById(R.id.lblDateSection); 
      } 
     } 

     convertView.setTag(mViewHolder); 
    } else { 

     mViewHolder = (ViewHolder) convertView.getTag(); 
    } 

    MapExtension me = mapValues.get(position); 

    String name = me.getStudentName(); 
    String number = me.getStudentNumber(); 

    if(mViewHolder.lblStudentName != null && mViewHolder.lblStudentNumber != null) { 
     mViewHolder.lblStudentName.setText(name); 
     mViewHolder.lblStudentNumber.setText(number);    
    } 

    // this block works fine earlier in regaining the position of the date 
    // but when the problem occurred, it never worked again. 
    if(mViewHolder.lblDateSection != null) { 

     newDateStr = dateFormat.format(getDate(date)); 

     if (dateLinkedHashMap.size() == 0) { 
      mViewHolder.lblDateSection.setText(newDateStr); 
      dateLinkedHashMap.put(position, newDateStr); 
     } else { 
      if (dateLinkedHashMap.containsValue(newDateStr)) { 
       if (dateLinkedHashMap.containsKey(position)) { 
        mViewHolder.lblDateSection.setText(newDateStr); 
       } else { 
        mViewHolder.lblDateSection.setText(""); 
       } 
      } else { 
       mViewHolder.lblDateSection.setText(newDateStr); 
       dateLinkedHashMap.put(position, newDateStr); 
      } 
     } 
    } 

    return convertView; 
} 
+0

、私はあなたを考えますconvertView == nullをチェックするだけでなく、positionパラメータも使用する必要があります。おそらくJeff SharkeyのSeparated List Adapterを見てみよう。http://jsharkey.org/blog/2008/08/18/separating-lists-with-headers-in-android-09/ – chaitanya

答えて

0

行を表す表示がもはや表示されている場合getViewメソッド()メソッドは、他の要素を示すためにconvertViewパラメータを介して、それを再利用しません。

ptimizationアダプタでは、新しいデータをコンバートするのではなく、新しいデータをコンバートビューに割り当てます。

何のビューは再利用可能でない場合には

、viewHolder実装でチェックする必要があるのgetビュー方式でconvertViewパラメータとして送信されますヌル

あなたがやろうとしているものに基づいて