2

複数のタイプのビューを持つListViewアダプターを作成しようとしています。私は次のチュートリアルに従っています:

http://android.amberfog.com/?p=296

ただし、次のコードを作成する最初のラウンドの後:

public class MultipleItemList extends Activity
{
  private MyCustomAdapter mAdapter;
  private ListView        mListView;
  private String          mTag = "MultipleItemList";

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

    setContentView( R.layout.main );

    mListView = (ListView)findViewById( R.id.main_list );

    mAdapter = new MyCustomAdapter();

    for( int i = 0; i < 50; i++ )
    {
      mAdapter.addItem( "Item: " + i );
    }

    mListView.setAdapter( mAdapter );
  }

  private class MyCustomAdapter extends BaseAdapter
  {
    private ArrayList<String> mData = new ArrayList<String>();
    private LayoutInflater    mInflater;

    public MyCustomAdapter()
    {
      mInflater = (LayoutInflater)getSystemService( Context.LAYOUT_INFLATER_SERVICE );
    }

    public void addItem( final String item )
    {
      mData.add( item );
      notifyDataSetChanged();
    }

    public int getCount()
    {
      return mData.size();
    }

    public String getItem( int position )
    {
      return mData.get( position );
    }

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

    public View getView( int position, View convertView, ViewGroup parent )
    {
      Log.e( mTag, "getView: " + position + " " + convertView );

      ViewHolder holder = null;

      if( convertView == null )
      {
        convertView = mInflater.inflate( R.layout.list_item, null );

        holder = new ViewHolder();

        holder.textView = (TextView)convertView.findViewById( R.id.item_text );

        convertView.setTag( holder );
      }
      else
      {
        holder = (ViewHolder)convertView.getTag();
      }

      holder.textView.setText( mData.get( position ) );

      return convertView;
    }
  }

  public static class ViewHolder
  {
    public TextView textView;
  }

}

main.xmlは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/main_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

</LinearLayout>

そして、list_item.xmlは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/item_text"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:text="TextView" 
        android:gravity="center_vertical" 
        android:paddingLeft="25dp"/>

</LinearLayout>

私は、出力が彼の期待される出力と同様になることを期待します。

02-05 13:47:32.559: INFO/System.out(947): getView 0 null
02-05 13:47:32.570: INFO/System.out(947): getView 1 null
02-05 13:47:32.589: INFO/System.out(947): getView 2 null
02-05 13:47:32.599: INFO/System.out(947): getView 3 null
02-05 13:47:32.619: INFO/System.out(947): getView 4 null
02-05 13:47:32.629: INFO/System.out(947): getView 5 null
02-05 13:47:32.708: INFO/System.out(947): getView 6 null
02-05 13:47:32.719: INFO/System.out(947): getView 7 null
02-05 13:47:32.729: INFO/System.out(947): getView 8 null

しかし、代わりに、ユーザーの操作なしで、画面をロードするだけで、次のようになります。

05-09 15:24:00.347: E/MultipleItemList(11109): getView: 0 null
05-09 15:24:00.357: E/MultipleItemList(11109): getView: 1 android.widget.LinearLayout@413304d0
05-09 15:24:00.357: E/MultipleItemList(11109): getView: 2 android.widget.LinearLayout@413304d0
05-09 15:24:00.357: E/MultipleItemList(11109): getView: 3 android.widget.LinearLayout@413304d0
05-09 15:24:00.357: E/MultipleItemList(11109): getView: 4 android.widget.LinearLayout@413304d0
05-09 15:24:00.357: E/MultipleItemList(11109): getView: 5 android.widget.LinearLayout@413304d0
05-09 15:24:00.367: E/MultipleItemList(11109): getView: 6 android.widget.LinearLayout@413304d0
05-09 15:24:00.367: E/MultipleItemList(11109): getView: 7 android.widget.LinearLayout@413304d0
05-09 15:24:00.367: E/MultipleItemList(11109): getView: 8 android.widget.LinearLayout@413304d0
05-09 15:24:00.367: E/MultipleItemList(11109): getView: 9 android.widget.LinearLayout@413304d0
05-09 15:24:00.407: E/MultipleItemList(11109): getView: 0 android.widget.LinearLayout@413304d0
05-09 15:24:00.407: E/MultipleItemList(11109): getView: 1 null
05-09 15:24:00.407: E/MultipleItemList(11109): getView: 2 null
05-09 15:24:00.417: E/MultipleItemList(11109): getView: 3 null
05-09 15:24:00.417: E/MultipleItemList(11109): getView: 4 null
05-09 15:24:00.417: E/MultipleItemList(11109): getView: 5 null
05-09 15:24:00.427: E/MultipleItemList(11109): getView: 6 null
05-09 15:24:00.427: E/MultipleItemList(11109): getView: 7 null
05-09 15:24:00.437: E/MultipleItemList(11109): getView: 8 null
05-09 15:24:00.437: E/MultipleItemList(11109): getView: 9 null
05-09 15:24:00.457: E/MultipleItemList(11109): getView: 0 null
05-09 15:24:00.457: E/MultipleItemList(11109): getView: 1 android.widget.LinearLayout@41338b60
05-09 15:24:00.457: E/MultipleItemList(11109): getView: 2 android.widget.LinearLayout@41338b60
05-09 15:24:00.457: E/MultipleItemList(11109): getView: 3 android.widget.LinearLayout@41338b60
05-09 15:24:00.457: E/MultipleItemList(11109): getView: 4 android.widget.LinearLayout@41338b60
05-09 15:24:00.457: E/MultipleItemList(11109): getView: 5 android.widget.LinearLayout@41338b60
05-09 15:24:00.467: E/MultipleItemList(11109): getView: 6 android.widget.LinearLayout@41338b60
05-09 15:24:00.467: E/MultipleItemList(11109): getView: 7 android.widget.LinearLayout@41338b60
05-09 15:24:00.467: E/MultipleItemList(11109): getView: 8 android.widget.LinearLayout@41338b60
05-09 15:24:00.467: E/MultipleItemList(11109): getView: 9 android.widget.LinearLayout@41338b60

リストの最初の10個のアイテムをレンダリングするために、いったいなぜこれほど多くの作業が行われているのでしょうか。

4

1 に答える 1

2

getViewyourActivityで見られる への呼び出しとチュートリアルで見られるへの呼び出しの違いはgetView、チュートリアルでListActivity. Adapters異なるアクティビティ クラスを使用する場合、getの呼び出し方法には根本的な違いがあります。

質問のコードのコードを取得し、報告されたログを再現できました。から拡張するように変更したところListActivity、チュートリアルで見たログを再現できました。

の StackTraceElements をgetView()調べると、次のことがわかります。

活動記録

getView: pos[0] convertView[null]
CallerClass[android.widget.AbsListView] CallerMethod[obtainView]
CallerClass[android.widget.ListView] CallerMethod[measureHeightOfChildren]
CallerClass[android.widget.ListView] CallerMethod[onMeasure]
CallerClass[android.view.View] CallerMethod[measure]
CallerClass[android.view.ViewGroup] CallerMethod[measureChildWithMargins]
CallerClass[android.widget.LinearLayout] CallerMethod[measureChildBeforeLayout]
CallerClass[android.widget.LinearLayout] CallerMethod[measureVertical]
CallerClass[android.widget.LinearLayout] CallerMethod[onMeasure]
CallerClass[android.view.View] CallerMethod[measure]
CallerClass[android.view.ViewGroup] CallerMethod[measureChildWithMargins]
CallerClass[android.widget.FrameLayout] CallerMethod[onMeasure]
CallerClass[android.view.View] CallerMethod[measure]
CallerClass[android.widget.LinearLayout] CallerMethod[measureVertical]
CallerClass[android.widget.LinearLayout] CallerMethod[onMeasure]
CallerClass[android.view.View] CallerMethod[measure]
CallerClass[android.view.ViewGroup] CallerMethod[measureChildWithMargins]
CallerClass[android.widget.FrameLayout] CallerMethod[onMeasure]
CallerClass[com.android.internal.policy.impl.PhoneWindow$DecorView] CallerMethod[onMeasure]
CallerClass[android.view.View] CallerMethod[measure]
CallerClass[android.view.ViewRootImpl] CallerMethod[performTraversals]
CallerClass[android.view.ViewRootImpl] CallerMethod[handleMessage]
CallerClass[android.os.Handler] CallerMethod[dispatchMessage]
CallerClass[android.os.Looper] CallerMethod[loop]
CallerClass[android.app.ActivityThread] CallerMethod[main]
CallerClass[java.lang.reflect.Method] CallerMethod[invokeNative]
CallerClass[java.lang.reflect.Method] CallerMethod[invoke]
CallerClass[com.android.internal.os.ZygoteInit$MethodAndArgsCaller] CallerMethod[run]
CallerClass[com.android.internal.os.ZygoteInit] CallerMethod[main]
CallerClass[dalvik.system.NativeStart] CallerMethod[main]

ListActivity.log

getView: pos[0] convertView[null]
CallerClass[android.widget.AbsListView] CallerMethod[obtainView]
CallerClass[android.widget.ListView] CallerMethod[makeAndAddView]
CallerClass[android.widget.ListView] CallerMethod[fillDown]
CallerClass[android.widget.ListView] CallerMethod[fillFromTop]
CallerClass[android.widget.ListView] CallerMethod[layoutChildren]
CallerClass[android.widget.AbsListView] CallerMethod[onLayout]
CallerClass[android.view.View] CallerMethod[layout]
CallerClass[android.view.ViewGroup] CallerMethod[layout]
CallerClass[android.widget.FrameLayout] CallerMethod[onLayout]
CallerClass[android.view.View] CallerMethod[layout]
CallerClass[android.view.ViewGroup] CallerMethod[layout]
CallerClass[android.widget.LinearLayout] CallerMethod[setChildFrame]
CallerClass[android.widget.LinearLayout] CallerMethod[layoutVertical]
CallerClass[android.widget.LinearLayout] CallerMethod[onLayout]
CallerClass[android.view.View] CallerMethod[layout]
CallerClass[android.view.ViewGroup] CallerMethod[layout]
CallerClass[android.widget.FrameLayout] CallerMethod[onLayout]
CallerClass[android.view.View] CallerMethod[layout]
CallerClass[android.view.ViewGroup] CallerMethod[layout]
CallerClass[android.view.ViewRootImpl] CallerMethod[performTraversals]
CallerClass[android.view.ViewRootImpl] CallerMethod[handleMessage]
CallerClass[android.os.Handler] CallerMethod[dispatchMessage]
CallerClass[android.os.Looper] CallerMethod[loop]
CallerClass[android.app.ActivityThread] CallerMethod[main]
CallerClass[java.lang.reflect.Method] CallerMethod[invokeNative]
CallerClass[java.lang.reflect.Method] CallerMethod[invoke]
CallerClass[com.android.internal.os.ZygoteInit$MethodAndArgsCaller] CallerMethod[run]
CallerClass[com.android.internal.os.ZygoteInit] CallerMethod[main]
CallerClass[dalvik.system.NativeStart] CallerMethod[main]

したがって、私の答えはListViews、さまざまなアクティビティ タイプが入力/レンダリングされる方法に重要な違いがあり、これが への呼び出しの量に違いをもたらすということgetViewです。

于 2012-05-10T00:08:58.833 に答える