2016-11-05 4 views
0

В методе getView, когда тип представления является vTypeItem, он должен возвращать весь элемент из моего списка массивов, но он возвращает все, кроме первого, и из-за этого в представлении списка отображается весь элемент, кроме первыйArrayAdapter getView не возвращает первый элемент

public class DrawerAdapter extends ArrayAdapter<DrawerCustomList> { 

private static final int vTypeHeader = 0; 
private static final int vTypeItem = 1; 
ArrayList<DrawerCustomList> mList = new ArrayList<>(); 

public DrawerAdapter(Context context, ArrayList<DrawerCustomList> list) { 
    super(context,0,list); 
    mList = list; 
} 

@Override 
public int getItemViewType(int position) { 
    return (position==0)?vTypeHeader:vTypeItem; 
} 

@Override 
public int getViewTypeCount() { 
    return 2; 
} 

@Override 
public int getCount() { 
    return mList.size(); 
} 

@NonNull 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    int type = getItemViewType(position); 
    View v = convertView; 
    MyViewHolder mViewHolder = null; 
    if (v==null){ 
     if(type==vTypeItem){ 
      v = LayoutInflater.from(getContext()).inflate(R.layout.drawer_single_item,parent,false); 
      mViewHolder= new MyViewHolder(v,type); 
      DrawerCustomList val = mList.get(position); 
      mViewHolder.itemImage.setImageResource(val.getmListImage()); 
      mViewHolder.itemName.setText(val.getmListName()); 
     }else { 
      v = LayoutInflater.from(getContext()).inflate(R.layout.drawer_header_layout,parent,false); 
      mViewHolder= new MyViewHolder(v,type); 
     } 
    } 
    v.setTag(mViewHolder); 
    return v; 
} 

public static class MyViewHolder{ 

    TextView itemName,headerName,headerEmail; 
    CircleImageView headerPicture; 
    ImageView itemImage; 

    public MyViewHolder(View v,int type){ 
     if(type==vTypeHeader){ 
      headerName = (TextView)v.findViewById(R.id.drawerHeaderName); 
      headerEmail = (TextView)v.findViewById(R.id.drawerHeaderEmail); 
      headerPicture = (CircleImageView)v.findViewById(R.id.drawerCircleImageView); 
     }else { 
      itemName = (TextView) v.findViewById(R.id.drawerItemName); 
      itemImage = (ImageView)v.findViewById(R.id.drawerItemImage); 
     } 
    } 
} 

}

ответ

0

Похоже, вы не учета для header зрения в методе getCount().

Первое изменение последнего в:

@Override 
public int getCount() { 
    return mList.size() + 1; // accounting for the header 
} 

Теперь имейте в виду, что в текущей версии метода getView(), если position == 0 вы будете отображать header, который является правильным. Если position == 1, хотя, вы будете делать

.... 
if(type==vTypeItem){ 
     v = LayoutInflater.from(getContext()).inflate(R.layout.drawer_single_item,parent,false); 
     mViewHolder= new MyViewHolder(v,type); 
     DrawerCustomList val = mList.get(position); 

Обратите внимание, как mList.get(position) будет на самом деле получить второй элемент в списке (с индексом 1), вместо первой, которая является то, что вам нужно. Поэтому измените эту строку на ...mList.get(position - 1), и ваша проблема должна быть решена.

+0

Выполнение этого: return mList.size() + 1; дает и исключает связанное исключение и делает положение == 1 не помогло, я все еще не получаю первый элемент списка – Nsnik

+0

hmm, если в 'getView()' вы всегда делаете 'mList.get (позиция - 1) 'не должно быть переполнения. Вы хотите вставить точное исключение, чтобы мы могли его проследить? – Vesko

Смежные вопросы