1

У меня есть адаптер:

public class CustomListAdapter_Words extends BaseAdapter {
    private static String TAG = "myApplication";
    private static String MSG = "Adapter: ";

    private final Activity context;
    private final String[][] words_form_1;
    private final String[][] words_form_2;

    public CustomListAdapter_Words(Activity context, String[][] words_form_1, String[][] words_form_2) {
        this.context = context;
        this.words_form_1 = words_form_1;
        this.words_form_2 = words_form_2;
    }

    static class ViewHolder_form_1 {
        public TextView textView_1_form_1;
        public TextView textView_2_form_1;
        public TextView textView_3_form_1;
    }

    static class ViewHolder_form_2 {
        public TextView textView_1_form_2;
        public TextView textView_2_form_2;
        public TextView textView_3_form_2;
        public TextView textView_4_form_2;
        public TextView textView_5_form_2;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder_form_1 holder_1;
        ViewHolder_form_2 holder_2;

        View rowView_1 = convertView;
        View rowView_2 = convertView;

        if (rowView_1 == null) {
            LayoutInflater inflater = context.getLayoutInflater();
            rowView_1 = inflater.inflate(R.layout.row_words_form_1, null, true);

            holder_1 = new ViewHolder_form_1();

            holder_1.textView_1_form_1 = (TextView) rowView_1.findViewById(R.id.text_1);
            holder_1.textView_2_form_1 = (TextView) rowView_1.findViewById(R.id.text_2);
            holder_1.textView_3_form_1 = (TextView) rowView_1.findViewById(R.id.text_3);

            rowView_1.setTag(holder_1);
        } else {
            holder_1 = (ViewHolder_form_1) rowView_1.getTag();
        }

        if (rowView_2 == null) {
            LayoutInflater inflater = context.getLayoutInflater();
            rowView_2 = inflater.inflate(R.layout.row_words_form_2, null, true);

            holder_2 = new ViewHolder_form_2();

            holder_2.textView_1_form_2 = (TextView) rowView_2.findViewById(R.id.text_1);
            holder_2.textView_2_form_2 = (TextView) rowView_2.findViewById(R.id.text_2);
            holder_2.textView_3_form_2 = (TextView) rowView_2.findViewById(R.id.text_3);
            holder_2.textView_4_form_2 = (TextView) rowView_2.findViewById(R.id.text_4);
            holder_2.textView_5_form_2 = (TextView) rowView_2.findViewById(R.id.text_5);

            rowView_2.setTag(holder_2);
        } else {
            holder_2 = (ViewHolder_form_2) rowView_2.getTag();
        }

        if (position < words_form_1.length) {
            holder_1.textView_1_form_1.setText(words_form_1[position][0]);
            holder_1.textView_2_form_1.setText(words_form_1[position][1]);
            holder_1.textView_3_form_1.setText(words_form_1[position][2]);

            return rowView_1;
        } else {
            holder_2.textView_1_form_2.setText(words_form_1[position][0]);
            holder_2.textView_2_form_2.setText(words_form_1[position][1]);
            holder_2.textView_3_form_2.setText(words_form_1[position][2]);
            holder_2.textView_3_form_2.setText(words_form_1[position][3]);
            holder_2.textView_3_form_2.setText(words_form_1[position][4]);

            return rowView_2;
        }
    }

    @Override
    public int getCount() {
        return words_form_1.length;
    }

    @Override
    public Object getItem(int position) {
        String[][] item = new String[1][8];

        item[0][0] = words_form_1[position][0];
        item[0][1] = words_form_1[position][1];
        item[0][2] = words_form_1[position][2];

        item[0][3] = words_form_2[position][0];
        item[0][4] = words_form_2[position][1];
        item[0][5] = words_form_2[position][2];
        item[0][6] = words_form_2[position][3];
        item[0][7] = words_form_2[position][4];

        return item;
    }

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

Вот тут, при выполнении выскакивает ошибка:

if (rowView_2 == null) {
        LayoutInflater inflater = context.getLayoutInflater();
        rowView_2 = inflater.inflate(R.layout.row_words_form_2, null, true);

        holder_2 = new ViewHolder_form_2();

        holder_2.textView_1_form_2 = (TextView) rowView_2.findViewById(R.id.text_1);
        holder_2.textView_2_form_2 = (TextView) rowView_2.findViewById(R.id.text_2);
        holder_2.textView_3_form_2 = (TextView) rowView_2.findViewById(R.id.text_3);
        holder_2.textView_4_form_2 = (TextView) rowView_2.findViewById(R.id.text_4);
        holder_2.textView_5_form_2 = (TextView) rowView_2.findViewById(R.id.text_5);

        rowView_2.setTag(holder_2);
    } else {
        holder_2 = (ViewHolder_form_2) rowView_2.getTag();
    }

Ошибка появляется на строке (75 строка): holder_2 = (ViewHolder_form_2) rowView_2.getTag();

stacktrace ошибки:

11-03 15:50:26.301    4800-4800/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.ClassCastException: com.dugin_rostislav.dictionary.CustomListAdapter_Words$ViewHolder_form_1 cannot be cast to com.dugin_rostislav.dictionary.CustomListAdapter_Words$ViewHolder_form_2
            at com.dugin_rostislav.dictionary.CustomListAdapter_Words.getView(CustomListAdapter_Words.java:75)
            at android.widget.AbsListView.obtainView(AbsListView.java:2143)
            at android.widget.ListView.makeAndAddView(ListView.java:1831)
            at android.widget.ListView.fillDown(ListView.java:674)
            at android.widget.ListView.fillGap(ListView.java:638)
            at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4930)
            at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3087)
            at android.widget.AbsListView.onTouchEvent(AbsListView.java:3361)
            at android.view.View.dispatchTouchEvent(View.java:7246)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2168)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1903)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1953)
            at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405)
            at android.app.Activity.dispatchTouchEvent(Activity.java:2410)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1901)
            at android.view.View.dispatchPointerEvent(View.java:7426)
            at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3220)
            at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3165)
            at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4292)
            at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4271)
            at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4363)
            at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179)
            at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
            at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:171)
            at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:4342)
            at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:4382)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
            at android.view.Choreographer.doCallbacks(Choreographer.java:562)
            at android.view.Choreographer.doFrame(Choreographer.java:530)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
            at android.os.Handler.handleCallback(Handler.java:725)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5041)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
            at dalvik.system.NativeStart.main(Native Method)

Само приложение крашится, когда я пролистываю ListView с этим адаптером, при чем первые 45 элементов (больше не помещается на экран) загружаются без сбоев. Ошибка происходит ТОЛЬКО при пролистывании. В сам адаптер поступает два двумерных массива по 100 элементов.

Что я делаю не так? Из-за чего крашится приложение?


С таким кодом:

   public class CustomListAdapter_Words extends BaseAdapter {
        private static String TAG = "myApplication";
        private static String MSG = "Adapter: ";

        private final Activity context;
        private final String[][] words_form_1;
        private final String[][] words_form_2;

        public CustomListAdapter_Words(Activity context, String[][] words_form_1, String[][] words_form_2) {
            this.context = context;
            this.words_form_1 = words_form_1;
            this.words_form_2 = words_form_2;
        }

        static class ViewHolder_form_1 {
            public TextView textView_1_form_1;
            public TextView textView_2_form_1;
            public TextView textView_3_form_1;
        }

        static class ViewHolder_form_2 {
            public TextView textView_1_form_2;
            public TextView textView_2_form_2;
            public TextView textView_3_form_2;
            public TextView textView_4_form_2;
            public TextView textView_5_form_2;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (position < words_form_1.length) {
                ViewHolder_form_1 holder_1;
                View rowView_1 = convertView;

                if (rowView_1 == null) {
                    LayoutInflater inflater = context.getLayoutInflater();
                    rowView_1 = inflater.inflate(R.layout.row_words_form_1, null, true);

                    holder_1 = new ViewHolder_form_1();

                    holder_1.textView_1_form_1 = (TextView) rowView_1.findViewById(R.id.text_1);
                    holder_1.textView_2_form_1 = (TextView) rowView_1.findViewById(R.id.text_2);
                    holder_1.textView_3_form_1 = (TextView) rowView_1.findViewById(R.id.text_3);

                    rowView_1.setTag(holder_1);
                } else {
                    holder_1 = (ViewHolder_form_1) rowView_1.getTag();
                }

                holder_1.textView_1_form_1.setText(words_form_1[position][0]);
                holder_1.textView_2_form_1.setText(words_form_1[position][1]);
                holder_1.textView_3_form_1.setText(words_form_1[position][2]);

                return rowView_1;
            } else {
                ViewHolder_form_2 holder_2;
                View rowView_2 = convertView;

                if (rowView_2 == null) {
                    LayoutInflater inflater = context.getLayoutInflater();
                    rowView_2 = inflater.inflate(R.layout.row_words_form_2, null, true);

                    holder_2 = new ViewHolder_form_2();

                    holder_2.textView_1_form_2 = (TextView) rowView_2.findViewById(R.id.text_1);
                    holder_2.textView_2_form_2 = (TextView) rowView_2.findViewById(R.id.text_2);
                    holder_2.textView_3_form_2 = (TextView) rowView_2.findViewById(R.id.text_3);
                    holder_2.textView_4_form_2 = (TextView) rowView_2.findViewById(R.id.text_4);
                    holder_2.textView_5_form_2 = (TextView) rowView_2.findViewById(R.id.text_5);

                    rowView_2.setTag(holder_2);
                } else { 
                    if(rowView_2.getTag() instanceof ViewHolder_form_2) {
                        holder_2 = (ViewHolder_form_2) rowView_2.getTag();
                    } else {
                        holder_2 = new ViewHolder_form_2();
                    }
                }

                holder_2.textView_1_form_2.setText(words_form_1[position][0]); //92 строка
                holder_2.textView_2_form_2.setText(words_form_1[position][1]);
                holder_2.textView_3_form_2.setText(words_form_1[position][2]);
                holder_2.textView_3_form_2.setText(words_form_1[position][3]);
                holder_2.textView_3_form_2.setText(words_form_1[position][4]);

                return rowView_2;
            }
        }

        @Override
        public int getCount() {
            return (words_form_1.length + words_form_2.length);
        }

        @Override
        public Object getItem(int position) {
            String[][] item = new String[1][8];

            item[0][0] = words_form_1[position][0];
            item[0][1] = words_form_1[position][1];
            item[0][2] = words_form_1[position][2];

            item[0][3] = words_form_2[position][0];
            item[0][4] = words_form_2[position][1];
            item[0][5] = words_form_2[position][2];
            item[0][6] = words_form_2[position][3];
            item[0][7] = words_form_2[position][4];

            return item;
        }

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

        @Override
        public int getItemViewType (int position) {
            return (position < words_form_1.length)?0:1;
        }

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

Ошибка такая:

11-03 19:52:20.757    1540-1540/? E/MessageQueue-JNI﹕ java.lang.ArrayIndexOutOfBoundsException: length=100; index=100
            at com.dugin_rostislav.dictionary.CustomListAdapter_Words.getView(CustomListAdapter_Words.java:92)
            at android.widget.AbsListView.obtainView(AbsListView.java:2159)
            at android.widget.ListView.makeAndAddView(ListView.java:1831)
            at android.widget.ListView.fillDown(ListView.java:674)
            at android.widget.ListView.fillGap(ListView.java:638)
            at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4930)
            at android.widget.AbsListView.onGenericMotionEvent(AbsListView.java:3640)
            at android.view.View.dispatchGenericMotionEventInternal(View.java:7341)
            at android.view.View.dispatchGenericMotionEvent(View.java:7322)
            at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782)
            at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735)
            at android.view.View.dispatchGenericMotionEvent(View.java:7315)
            at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782)
            at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735)
            at android.view.View.dispatchGenericMotionEvent(View.java:7315)
            at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782)
            at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735)
            at android.view.View.dispatchGenericMotionEvent(View.java:7315)
            at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782)
            at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735)
            at android.view.View.dispatchGenericMotionEvent(View.java:7315)
            at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782)
            at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735)
            at android.view.View.dispatchGenericMotionEvent(View.java:7315)
            at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782)
            at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735)
            at android.view.View.dispatchGenericMotionEvent(View.java:7315)
            at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782)
            at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735)
            at android.view.View.dispatchGenericMotionEvent(View.java:7315)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchGenericMotionEvent(PhoneWindow.java:1961)
            at com.android.internal.policy.impl.PhoneWindow.superDispatchGenericMotionEvent(PhoneWindow.java:1415)
            at android.app.Activity.dispatchGenericMotionEvent(Activity.java:2446)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchGenericMotionEvent(PhoneWindow.java:1915)
            at android.view.View.dispatchPointerEvent(View.java:7428)
            at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3220)
            at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3165)
            at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4292)
            at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4271)
            at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4363)
            at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179)
            at android.os.MessageQueue.nativePollOnce(Native Method)
            at android.os.MessageQueue.next(MessageQueue.java:125)
            at android.os.Looper.loop(Looper.java:124)
            at android.app.ActivityThread.main(ActivityThread.java:5041)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
            at dalvik.system.NativeStart.main(Native Method)
11-03 19:52:20.773    1540-1540/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.ArrayIndexOutOfBoundsException: length=100; index=100
            at com.dugin_rostislav.dictionary.CustomListAdapter_Words.getView(CustomListAdapter_Words.java:92)
            at android.widget.AbsListView.obtainView(AbsListView.java:2159)
            at android.widget.ListView.makeAndAddView(ListView.java:1831)
            at android.widget.ListView.fillDown(ListView.java:674)
            at android.widget.ListView.fillGap(ListView.java:638)
            at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4930)
            at android.widget.AbsListView.onGenericMotionEvent(AbsListView.java:3640)
            at android.view.View.dispatchGenericMotionEventInternal(View.java:7341)
            at android.view.View.dispatchGenericMotionEvent(View.java:7322)
            at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782)
            at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735)
            at android.view.View.dispatchGenericMotionEvent(View.java:7315)
            at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782)
            at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735)
            at android.view.View.dispatchGenericMotionEvent(View.java:7315)
            at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782)
            at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735)
            at android.view.View.dispatchGenericMotionEvent(View.java:7315)
            at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782)
            at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735)
            at android.view.View.dispatchGenericMotionEvent(View.java:7315)
            at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782)
            at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735)
            at android.view.View.dispatchGenericMotionEvent(View.java:7315)
            at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782)
            at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735)
            at android.view.View.dispatchGenericMotionEvent(View.java:7315)
            at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1782)
            at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1735)
            at android.view.View.dispatchGenericMotionEvent(View.java:7315)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchGenericMotionEvent(PhoneWindow.java:1961)
            at com.android.internal.policy.impl.PhoneWindow.superDispatchGenericMotionEvent(PhoneWindow.java:1415)
            at android.app.Activity.dispatchGenericMotionEvent(Activity.java:2446)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchGenericMotionEvent(PhoneWindow.java:1915)
            at android.view.View.dispatchPointerEvent(View.java:7428)
            at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3220)
            at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3165)
            at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4292)
            at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4271)
            at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4363)
            at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179)
            at android.os.MessageQueue.nativePollOnce(Native Method)
            at android.os.MessageQueue.next(MessageQueue.java:125)
            at android.os.Looper.loop(Looper.java:124)
            at android.app.ActivityThread.main(ActivityThread.java:5041)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
            at dalvik.system.NativeStart.main(Native Method)
  • 1
    Я часто вижу вопросы на подобие ваших и все проблемы тупо из-за не знания работы адаптера и что для чего нужно. Перед тем как что-то делать вы почитайте нормальные туториалы или офф. туториалы от гугл – BORSHEVIK Nov 04 '15 at 10:06
  • @BORSHEVIK, я не нашел нормальных туториалов на русском (кривые-то я прочитал, но про работу адаптера, что за чем в нем идет — ни слова), а для туториалов от гугла у меня знания английского сильно не хватает. –  Nov 04 '15 at 14:01

3 Answers3

2
View rowView_1 = convertView;
View rowView_2 = convertView;

крашиться потому что у вас в rowView_2=rowView_1, и тип ViewHolder_form_1, а вы его пытаетесь привести к типу ViewHolder_form_2.

if (rowView_2 == null) {...}
else {
   (ViewHolder_form_2) rowView_2.getTag();
}

тут у вас rowView_2 не равно null, оно равно rowView_1, и соответственно тип тега там тоже 1.

  • А как это исправить? Нельзя сделать new convertView. Не допускать выполнение сразу обоих присваиваний — тоже не вышло. –  Nov 03 '15 at 17:36
2

Вам надо оперировать с холдерами после проверки позиции, а не до. Просто поместите второй блок кода в блок else (проверка позиции). Аналогичный блок операций с холдером1 - в if(position < words_form_1.length)

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

UPD_0:

Также попробуйте добавить методы для поддержки разных типов разметки для элементов.

@Override
public int getItemViewType (int position)
{
    return (position < words_form_1.length)?0:1;
}

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

Лично я сомневаюсь, что в этом дело, но вполне может помочь.

UPD_1:

Я в коде вашем ошибок не вижу. Возможно они где-то в другом месте. Предлагаю такой костыль вам использовать - проверять какой класс в аргумент приходит.

if(rowView_2.getTag() instanceof ViewHolder_form_2)
{
     holder_2 = (ViewHolder_form_2) rowView_2.getTag();
}
else
{
    holder_2 = new ViewHolder_form_2();
}
  • 1
    Не работает - что это значит? – ЮрийСПб Nov 03 '15 at 19:53
  • Дополнил. Я комментарии удалю, чтобы было чисто. –  Nov 03 '15 at 19:59
  • Юрий, а может есть какой-то другой способ загружать два массива в разметки? Мой вариант, видимо, не самый лучший... Хотя другой будет тяжелее понять. –  Nov 03 '15 at 20:15
  • 1
    Теперь у вас уже другая ошибка. Вы пытаетесь где-то обратиться к сотому (индекс имею в виду) элементу массива, коий длинной в сто элементов. Т.е. к несуществуещему элементу. И вы опять забыли указать конкретную строчку, на коей ошибка вылезла. – ЮрийСПб Nov 03 '15 at 20:57
  • 1
    У вас ошибка копи-паста. Вы вместо второго пытаетесь из первого массива значения извлечь. Будьте внимательнее. – ЮрийСПб Nov 03 '15 at 20:59
  • Исправил, но ошибка осталась. Та же. –  Nov 03 '15 at 23:58
  • Да и изначально программа не знает, какой массив я хотел загружать, а ошибка выхода за приделы должны была быть только через 2 строки. –  Nov 04 '15 at 00:02
  • 1
    У вас какой-то совсем странная подход... Что и зачем вы делаете непонятно. Я бы на вашем месте взял бы и с нуля написал простейший адаптер а потом уже пытался в него данные писать. Что у вас в данный момент происходит понять никак нельзя. – ЮрийСПб Nov 04 '15 at 00:38
  • Я пробовал сначала самый простой, потом добавил ViewHolder, а когда начал пытаться разделить на два массива и две разметки (начало вопроса), начались ошибки... –  Nov 04 '15 at 03:21
  • 1
    Только что лежал, смотрел в потолок, думал и понял в чем косяк! Во втором массиве 100 элементов, а position равно 101. Присваивать нужно position - words_form_1.lenght. Завтра исправлю, уже спать охота :). –  Nov 04 '15 at 03:57
2

Во первых - существует конвенции по написанию кода. Java Convention и Android-разработчика, их настоятельно рекомендуется придерживаться, в частности при назначении имен. Так, имя переменной должно быть записано в LowCamaelCase стиле. Быть кратким, но информативным.

Во вторых - у вас очевидное непонимание того, что вы делаете. Вам нужно уделить много больше внимания теории, затем уже пытаться реализовать что то на практике.

По коду:
Если вы решили использовать метод getItemViewType(), то его следует не только переопределить, но использовать по прямому назначению - для определения какой тип айтема требуется в текущей позиции.
Паттерн ViewHolder всего лишь хранит ссылки на виджеты, не стоит усложнять код, создавая множество этих холдеров и тем более строить на них бизнес-логику - паттерн для этого не предназначен. Более того, даже в моем примере класс ViewHolder избыточен, здесь достаточно определить пять полей для TextView - первый тип айтема будет использовать только первые три, второй тип - все пять. Переписывать еще и это мне было решительно лень.
Что возвращает ваш метод getItem() мне осилить не удалось, будем надеятся это именно то, что вам нужно получать от этого метода.

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

public class WordsAdapter extends BaseAdapter {

    private final String TAG = "myApplication";
    private final String MSG = "Adapter: ";
    private final int FIRST_WORDS = 0;
    private final int SECOND_WORDS = 1;
    private final int FIRST_ARRAY_LENGTH;

    private final Activity mContext;
    private final String[][] mWordsForm1;
    private final String[][] mWordsForm2;
    private LayoutInflater mInflater;

    public WordsAdapter(Activity context, String[][] wordsForm1, String[][] wordsForm2) {

        mContext = context;
        mWordsForm1 = wordsForm1;
        mWordsForm2 = wordsForm2;
        mInflater = context.getLayoutInflater();
        FIRST_ARRAY_LENGTH = mWordsForm1.length;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder;
        int type = getItemViewType(position);

        if (convertView == null) {
            holder = new ViewHolder();
            switch (type) {
                case FIRST_WORDS:
                    convertView = mInflater.inflate(R.layout.row_words_form_1, null, true);

                    holder.textView1Form1 = (TextView) convertView.findViewById(R.id.text_1);
                    holder.textView2Form1 = (TextView) convertView.findViewById(R.id.text_2);
                    holder.textView3Form1 = (TextView) convertView.findViewById(R.id.text_3);
                    break;
                case SECOND_WORDS:
                    convertView = mInflater.inflate(R.layout.row_words_form_2, null, true);

                    holder.textView1Form2 = (TextView) convertView.findViewById(R.id.text_1);
                    holder.textView2Form2 = (TextView) convertView.findViewById(R.id.text_2);
                    holder.textView3Form2 = (TextView) convertView.findViewById(R.id.text_3);
                    holder.textView4Form2 = (TextView) convertView.findViewById(R.id.text_4);
                    holder.textView5Form2 = (TextView) convertView.findViewById(R.id.text_5);
                    break;
            }
            convertView.setTag(holder);
        }
        else {
          holder = (ViewHolder) convertView.getTag();
        }

        switch (type){
            case FIRST_WORDS:
                holder.textView1Form1.setText(mWordsForm1[position][0]);
                holder.textView2Form1.setText(mWordsForm1[position][1]);
                holder.textView3Form1.setText(mWordsForm1[position][2]);
                break;
            case SECOND_WORDS:
                holder.textView1Form2.setText(mWordsForm2[position - FIRST_ARRAY_LENGTH][0]);
                holder.textView2Form2.setText(mWordsForm2[position - FIRST_ARRAY_LENGTH][1]);
                holder.textView3Form2.setText(mWordsForm2[position - FIRST_ARRAY_LENGTH][2]);
                holder.textView3Form2.setText(mWordsForm2[position - FIRST_ARRAY_LENGTH ][3]);
                holder.textView3Form2.setText(mWordsForm2[position - FIRST_ARRAY_LENGTH][4]);
                break;
        }
        return convertView;
    }

    @Override
    public int getCount() {
        return (mWordsForm1.length + mWordsForm2.length);
    }

    @Override
    public int getItemViewType (int position) {
        return (position < mWordsForm1.length) ? FIRST_WORDS:SECOND_WORDS;
    }

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

    @Override
    public Object getItem(int position) {
        String[][] item = new String[1][8];

        item[0][0] = mWordsForm1[position][0];
        item[0][1] = mWordsForm1[position][1];
        item[0][2] = mWordsForm1[position][2];

        item[0][3] = mWordsForm2[position][0];
        item[0][4] = mWordsForm2[position][1];
        item[0][5] = mWordsForm2[position][2];
        item[0][6] = mWordsForm2[position][3];
        item[0][7] = mWordsForm2[position][4];

        return item;
    }

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

    static class ViewHolder {
        public TextView textView1Form1;
        public TextView textView2Form1;
        public TextView textView3Form1;
        public TextView textView1Form2;
        public TextView textView2Form2;
        public TextView textView3Form2;
        public TextView textView4Form2;
        public TextView textView5Form2;
    }

}
pavlofff
  • 36,765
  • 1
    У вас ошибочка тут, кою я и сам вчера не заметил, а ТС таки нашёл (см. коммент по моим ответом). Из второго массива значения надо не по позиции брать, а по position-FIRST_ARRAY_LENGHT – ЮрийСПб Nov 04 '15 at 10:22
  • 2
    @ЮрийСПб Да, точно. – pavlofff Nov 04 '15 at 10:48
  • С Вашим кодом стало все понятнее. Я писал адаптер, но не понимал часть написанного, по причине незнания что это, я смотрел официальную документацию, но фразы "этот метод устанавливает метку для объекта", что говорили про setTag и тому подобные — мне ничего не говорили. В вашем же коде все понятно (ну почти все. Я еще не до конца понимаю, как идет "круговорот методов и переменных" в адаптере), наглядно и... работает! По смыслу, осталось еще немного, так что программу допишу, а потом книгу по Android в руки и впе... читать! –  Nov 04 '15 at 13:50