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

Как используется метод getView() и где он вызван?

Я новичок в разработке Android и слежу за учебниками, доступными на веб-сайте Android. В настоящее время я нахожусь в разделе уроков для Views, в частности, для Grid Views: Привет, Grid View Tutorial.

У меня возникли проблемы с пониманием того, как представления выполняются через адаптер. Я понимаю, что вы должны переопределить метод getView() в вашем классе адаптера, и в этом методе вы определяете, как настроены ваши представления. Я не понимаю, откуда getView() действительно вызван? Возможно, у меня здесь неправильный вид менталитета, но в приведенном ниже коде (учебник Grid View) я не вижу никаких вызовов getView() (или любых других вещей, используемых в классе адаптера, таких как getCount()).

main.xml

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/gridview"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:columnWidth="90dp"
    android:numColumns="auto_fit"
    android:verticalSpacing="10dp"
    android:horizontalSpacing="10dp"
    android:stretchMode="columnWidth"
    android:gravity="center" />

Start.java

package com.examples.hellogridlayout;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

public class Start extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    GridView gridview = (GridView)findViewById(R.id.gridview);
    gridview.setAdapter(new ImageAdapter(this));

    gridview.setOnItemClickListener(new OnItemClickListener(){
        public void onItemClick(AdapterView<?> parent,View v, int position, long     id){
            Toast.makeText(Start.this, "" + position,Toast.LENGTH_SHORT).show();
        }

      });
    }
}

ImageAdapter.java

package com.examples.hellogridlayout;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

public class ImageAdapter extends BaseAdapter {
    private Context mContext;

    public ImageAdapter(Context c) {
        mContext = c;
    }

    public int getCount() {
    return mThumbIds.length;
    }

    public Object getItem(int position) {
    return null;
    }

    public long getItemId(int position) {
        return 0;
    }

    // create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;
        if (convertView == null) {  // if it not recycled, initialize some attributes
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(8, 8, 8, 8);
        } else {
            imageView = (ImageView) convertView;
        }

        imageView.setImageResource(mThumbIds[position]);
        return imageView;
    }

    // references to our images
    private Integer[] mThumbIds = {
            R.drawable.sample_2, R.drawable.sample_3,
            R.drawable.sample_4, R.drawable.sample_5,
            R.drawable.sample_6, R.drawable.sample_7,
            R.drawable.sample_0, R.drawable.sample_1,
            R.drawable.sample_2, R.drawable.sample_3,
            R.drawable.sample_4, R.drawable.sample_5,
            R.drawable.sample_6, R.drawable.sample_7,
            R.drawable.sample_0, R.drawable.sample_1,
            R.drawable.sample_2, R.drawable.sample_3,
            R.drawable.sample_4, R.drawable.sample_5,
            R.drawable.sample_6, R.drawable.sample_7
    };
}
4b9b3361

Ответ 1

Установив адаптер, вы сообщаете GridView, чтобы получать из Адаптера представления, чтобы заполнить все решетки. Поэтому getView внутренне вызывается GridView для заполнения макета.

Вот почему все адаптеры реализуют Adapter интерфейс, чтобы любой AdapterView мог запросить адаптер.

Ответ 2

Adapter.getView вызывается внутри метода ObtainView, унаследованного от GridView родительского класса AbsListView, при этом объекты ScrapView передаются, когда они доступны:

child = mAdapter.getView(position, scrapView, this);

Затем ObtainView реализуется непосредственно в GridView.onMeasure, но также в нескольких других обратных вызовах, вызывающих GridView.layoutChildren, включая унаследованный метод onTouchEvent, который обрабатывает прокрутку, прокрутку и другую навигацию по касанию.