Получение viewTypeCount <1 ошибка для просмотра списка несколько раз - PullRequest
3 голосов
/ 17 октября 2011

Я получаю

IllegalArgumentException: не может иметь viewTypeCount <1 </p>

для моего списка просмотра несколько раз.Я знаю, что это для list.size().Но это случается не часто, только несколько раз я получаю эту ошибку и приложение вылетает.Я еще не получил решение для этого, кто-нибудь знает это?

Обновление: это то, что я получаю

10-17 05:34:49.103: ERROR/AndroidRuntime(1683): FATAL EXCEPTION: main
10-17 05:34:49.103: ERROR/AndroidRuntime(1683): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.racontrs/com.racontrs.Racontours.City}: java.lang.IllegalArgumentException: Can't have a viewTypeCount < 1
10-17 05:34:49.103: ERROR/AndroidRuntime(1683):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
10-17 05:34:49.103: ERROR/AndroidRuntime(1683):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
10-17 05:34:49.103: ERROR/AndroidRuntime(1683):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
10-17 05:34:49.103: ERROR/AndroidRuntime(1683):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
10-17 05:34:49.103: ERROR/AndroidRuntime(1683):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-17 05:34:49.103: ERROR/AndroidRuntime(1683):     at android.os.Looper.loop(Looper.java:130)
10-17 05:34:49.103: ERROR/AndroidRuntime(1683):     at android.app.ActivityThread.main(ActivityThread.java:3683)
10-17 05:34:49.103: ERROR/AndroidRuntime(1683):     at java.lang.reflect.Method.invokeNative(Native Method)
10-17 05:34:49.103: ERROR/AndroidRuntime(1683):     at java.lang.reflect.Method.invoke(Method.java:507)
10-17 05:34:49.103: ERROR/AndroidRuntime(1683):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
10-17 05:34:49.103: ERROR/AndroidRuntime(1683):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
10-17 05:34:49.103: ERROR/AndroidRuntime(1683):     at dalvik.system.NativeStart.main(Native Method)
10-17 05:34:49.103: ERROR/AndroidRuntime(1683): Caused by: java.lang.IllegalArgumentException: Can't have a viewTypeCount < 1
10-17 05:34:49.103: ERROR/AndroidRuntime(1683):     at android.widget.AbsListView$RecycleBin.setViewTypeCount(AbsListView.java:4387)
10-17 05:34:49.103: ERROR/AndroidRuntime(1683):     at android.widget.ListView.setAdapter(ListView.java:460)
10-17 05:34:49.103: ERROR/AndroidRuntime(1683):     at com.racontrs.Racontours.City.onCreate(City.java:66)
10-17 05:34:49.103: ERROR/AndroidRuntime(1683):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
10-17 05:34:49.103: ERROR/AndroidRuntime(1683):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
10-17 05:34:49.103: ERROR/AndroidRuntime(1683):  
   ... 11 more

И для этой строки я получаю

objTourListAdapter = new TourListAdapter(tourList, this);

listView.setAdapter(objTourListAdapter); // getting this when I try to add the adapter

Внутри TourListAdapter,

public class TourListAdapter extends BaseAdapter {

    protected static final Context TourListAdapter = null;

    private ArrayList<Tour> tourList;

    private OnClickListener clickListener;
    private LayoutInflater mInflater;
    ViewHolder holder;
    City city;

    public TourListAdapter(ArrayList<Tour> tourList, City city) {
        this.city = city;
        this.tourList = tourList;
        mInflater = LayoutInflater.from(city);
        clickListener = (OnClickListener) city;
    }

    @Override
    public int getViewTypeCount() {
        return tourList.size();
    }

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

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

    @Override
    public Object getItem(int position) {
        return this.tourList.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.listbox, null);
            convertView.setOnClickListener(clickListener);

            holder = new ViewHolder();
            holder.view1 = (TextView) convertView.findViewById(R.id.listText);
            holder.desc = (TextView) convertView.findViewById(R.id.editText1);
            holder.index = (TextView) convertView.findViewById(R.id.index);
            holder.desc.setVisibility(View.GONE);
            holder.priceBtn = (Button) convertView.findViewById(R.id.prcBtn);
            holder.icon = (ImageView) convertView.findViewById(R.id.listIcon);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.view1.setText((String) tourList.get(position).getObjtourName());
        holder.desc.setText((String) tourList.get(position).getDescription());

        holder.priceBtn.setText((String) tourList.get(position).getObjPrice());
        holder.priceBtn.setOnClickListener(clickListener);

        holder.index.setText(String.valueOf(position));

        holder.icon.setImageBitmap(BitmapFactory
                .decodeFile((RaconTours.PATH + RaconTours.city + File.separator
                        + tourList.get(position).getObjtourName()
                        + File.separator + tourList.get(position)
                        .getThumbnailImageName()).replace(" ", "_")));

        return convertView;
    }
}

Это моя деятельность по созданию кода

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.city);
    Bundle bundle = getIntent().getExtras();
    tourList = (ArrayList<Tour>) bundle.get("arrayTour");
    citytextView = (TextView) findViewById(R.id.tourcity);
    ImageButton btnBack = (ImageButton) findViewById(R.id.btnBack);
    btnBack.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            setResult(RESULT_OK);
            finish();
        }
    });
    btnMap = (ImageButton) findViewById(R.id.btnMap);
    btnMap.setOnClickListener(this);
    btnUt = (ImageButton) findViewById(R.id.utBtn);
    btnUt.setOnClickListener(this);
    // setting the City Name
    citytextView.setText(RaconTours.city);
    /**** Identifying a listView ****/
    ListView listView = (ListView) findViewById(R.id.tourList);
    /**** Creating a new List Adapter class for binding the values ****/
    objTourListAdapter = new TourListAdapter(tourList, this);
    listView.setAdapter(objTourListAdapter);
    listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    metrics = getResources().getDisplayMetrics();
    float dpForIcon = 60f;
    heightIcon = (int) (metrics.density * dpForIcon + 0.5f);
    if (null != RaconTours.dialog) {
        RaconTours.dialog.dismiss();
    }
}

Ответы [ 3 ]

5 голосов
/ 17 октября 2011

getViewTypeCount() должно возвращать количество различных представлений, содержащихся в вашем ListView. Если все элементы в вашем ListView имеют одинаковый тип, вы должны вернуть 1.

Это неправильно,

@Override
public int getViewTypeCount() {

    return tourList.size();

}

потому что когда tourList.size () равен нулю, вы получите это исключение

Так как у вас есть только один «тип» элемента списка, используйте это:

@Override
public int getViewTypeCount() {
    return 1;
}
4 голосов
/ 17 октября 2011

Поэтому я не уверен, что вы хотите сделать, но понимаю, что getViewTypeCount () вызывается только один раз, когда вы вызываете setAdapter в представлении списка. Поэтому, если список на данный момент пустой или пустой, ваше приложение не будет работать. Возвращаемое здесь значение следует рассматривать как скорее константу.

ViewTypes используются в View Recycling. По сути, определяя его как длину списка, вы говорите, что каждый объект в списке не сможет повторно использовать любое другое представление, которое использовали другие в списке. Если это действительно так, то это нормально, но минимальное значение должно быть всегда 1. Также это не может измениться после вызова setAdapter, пока вы не создадите новый адаптер, который будет установлен в представлении списка с новым содержимым (это просто горячий вид рециркулятора в листере работает).

Я бы предположил, что вы можете обойтись с viewtypeCount, равным 1, поскольку все ваши объекты относятся к одному типу. Так что просто не переопределяйте getItemViewType или getItemViewCount (). По умолчанию они равны 0 и 1 соответственно, что будет достаточно для размещенного вами кода адаптера и при этом будет эффективно использовать утилиту просмотра.

2 голосов
/ 08 июля 2016

Я знаю, что это старый вопрос, но любой, кто бродит здесь так же, как я, может получить выгоду.Вы видите, мне нужно было использовать:

@Override
public int getViewTypeCount() {

    return tourList.size();

}

Поскольку это был единственный способ, которым мои данные строки сохраняли свою позицию во время прокрутки.Но я иногда сталкивался с проблемой сбоя.Поэтому я добавил кое-что, чтобы предотвратить падение, и теперь у меня все хорошо:

  @Override
    public int getViewTypeCount() {
        int count;
        if (mItems.size() > 0) {
            count = getCount();
        } else {
            count = 1;
        }
        return count;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...