ArrayAdapter getView не возвращает первый элемент

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

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

1 ответ

  1. Похоже, вы не учитываете 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)и ваша проблема должна быть решена.