Подтвердить что ты не робот

Несколько вызовов getView() в GridView

Моя активность состоит из GridView, который содержит более 40 элементов. После запуска пользователь мог видеть максимум 15 элементов (3 строки, 5 элементов в каждой строке). Я написал в теле getView(), чтобы перейти к номеру LogCat получения:

Log.i("getView()", "GETTING VIEW_POSITION[" + String.valueOf(position) + "]" + (convertView != null?convertView.toString():"null"));

После запуска моего приложения я получаю такой журнал:

02-09 14:34:56.900: INFO/getView()(388): GETTING VIEW_POSITION[0]null
02-09 14:34:57.300: INFO/getView()(388): GETTING VIEW_POSITION[0][email protected]  
02-09 14:34:57.300: INFO/getView()(388): GETTING VIEW_POSITION[1]null
02-09 14:34:57.400: INFO/getView()(388): GETTING VIEW_POSITION[2]null
02-09 14:34:57.510: INFO/getView()(388): GETTING VIEW_POSITION[3]null
02-09 14:34:57.620: INFO/getView()(388): GETTING VIEW_POSITION[4]null
02-09 14:34:57.720: INFO/getView()(388): GETTING VIEW_POSITION[5]null
02-09 14:34:57.840: INFO/getView()(388): GETTING VIEW_POSITION[6]null
02-09 14:34:57.930: INFO/getView()(388): GETTING VIEW_POSITION[7]null
02-09 14:34:58.273: DEBUG/dalvikvm(388): GC freed 3530 objects / 322744 bytes in 270ms
02-09 14:34:58.280: INFO/getView()(388): GETTING VIEW_POSITION[8]null
02-09 14:34:58.300: INFO/getView()(388): GETTING VIEW_POSITION[9]null
02-09 14:34:58.320: INFO/getView()(388): GETTING VIEW_POSITION[10]null
02-09 14:34:58.340: INFO/getView()(388): GETTING VIEW_POSITION[11]null
02-09 14:34:58.360: INFO/getView()(388): GETTING VIEW_POSITION[12]null
02-09 14:34:58.380: INFO/getView()(388): GETTING VIEW_POSITION[13]null
02-09 14:34:58.400: INFO/getView()(388): GETTING VIEW_POSITION[14]null
02-09 14:34:59.220: INFO/getView()(388): GETTING VIEW_POSITION[0]null
02-09 14:34:59.490: INFO/getView()(388): GETTING VIEW_POSITION[0][email protected]

Я также добавил эту статью о такой проблеме. Но высота My GridView в XML-описании задана как заполняющий родительский элемент:

<?xml version="1.0" encoding="utf-8"?>

<GridView xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/grid"
                android:layout_width="fill_parent" 
                android:layout_height="fill_parent"
                android:numColumns="auto_fit"
                android:horizontalSpacing="10dp"
                android:verticalSpacing="10dp"
                android:columnWidth="140dp"
                android:gravity="center"
                android:scrollbars="none"
                /> 

И, наконец, чтобы устранить все сомнения, вот мой код адаптера:

public class ImageAdapter extends BaseAdapter
    {
        private Activity activity;
        private LayoutInflater inflater = null;
        private ArrayList<Photo> photoes;

        public ImageAdapter(Activity a, ArrayList<Photo> pictures)
        {
            photoes = pictures;
            activity = a;
            inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent)
        {
            Log.i("getView()", "GETTING VIEW_POSITION[" + String.valueOf(position) + "]" + (convertView != null?convertView.toString():"null"));
                View mViewSlice = convertView;
                if(convertView == null) {
                    mViewSlice = inflater.inflate(R.layout.photo_preview, null);
                    ((TextView) mViewSlice.findViewById(R.id.name_of_photo)).setText(photoes.get(position).getName());

                    mViewSlice.setPadding(5, 5, 5, 5);
                    mViewSlice.setLayoutParams(new GridView.LayoutParams(-2, -2));

                }



               return mViewSlice;
        }

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

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

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

Я надеюсь, что кто-то ответит на мою проблему и поможет мне решить ее.

Ожидание ваших предложений. Алекс.

4b9b3361

Ответ 1

Ответ на эту ссылку, если я достаточно четко думаю,

Нет абсолютно никакой гарантии на количество раз getView() будет вызывается для любой заданной позиции

Теперь это замечание также подразумевает, что вы не должны использовать wrap_content

обычно происходит со списками и сетками которые имеют высоту, установленную на wrap_content

Но это не значит, что этого не произойдет в других ситуациях. Ошибка была закрыта как "WorkingAsIntended", поэтому я не думаю, что вы можете сделать слишком много. Это просто то, что может случиться.

Ответ 2

Для меня это еще хуже: 0 позиция вызывается часто 10 раз. И он называется даже если я в конце списка, без позиции 0 на экране.

Мое решение - это статический ArrayList элементов, которые в настоящее время обрабатываются для отображения, и я игнорирую эти двойные вызовы. Это не лучшее решение, хотя, поскольку оно все еще использует ресурсы, чтобы получить 0-позицию, пока она даже не отображается на экране.

Похоже на ошибку, я думаю, что я буду кэшировать View для позиции 0, чтобы получить быструю и правильную возвращаемую величину, даже если позиция отсутствует на экране.

Android 4.2.2.

Ответ 3

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

    class MyAdapter extends BaseAdapter{

    List<View> views;

    public MyAdapter(List<View> views){
        this.views = views;
    }

    ...

    public View getView(int position, View convertView, ViewGroup parent){
        return views.get(position);     // now your safe even if element[0] is called n times
    }
}

class MyActivity extends Activity{

    GridView grid;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        List<View> views = create_your_views():

        MyAdapter adapter = new MyAdapter(views);

        grid.setAdapter(adapter);           
    }
}