2

リストビュー用のカスタムアダプタがあります(ArrayAdapterを拡張します)。リストは正常にロードされます。ただし、リスト内のアイテム、つまりリスト内の5番目のアイテムをクリックすると、getViewの位置は常に5ではなく0になります。0でconvertViewないnull場合は、header変数をR.id.listHeaderTvTextViewに初期化する必要があります。 、しかしそれはそれを見つけることができず、nullになることになります。問題を修正してnullにならない

ようにするにはどうすればよいですか?positionconvertView

編集:onItemClickメソッドをチェックした後、位置は正しいです。唯一の問題は、onItemClickメソッドの後で、ビューが拡張されていないためにgetViewが呼び出され、そこでクラッシュすることです。

LOGCAT:

02-27 16:35:25.280: E/AndroidRuntime(6330): FATAL EXCEPTION: main
02-27 16:35:25.280: E/AndroidRuntime(6330): java.lang.NullPointerException
02-27 16:35:25.280: E/AndroidRuntime(6330):     at moflow.adapters.CatalogListAdapter.getView(CatalogListAdapter.java:66)
02-27 16:35:25.280: E/AndroidRuntime(6330):     at android.widget.AbsListView.obtainView(AbsListView.java:1294)
02-27 16:35:25.280: E/AndroidRuntime(6330):     at android.widget.ListView.makeAndAddView(ListView.java:1727)
02-27 16:35:25.280: E/AndroidRuntime(6330):     at android.widget.ListView.fillSpecific(ListView.java:1272)
02-27 16:35:25.280: E/AndroidRuntime(6330):     at android.widget.ListView.layoutChildren(ListView.java:1558)
02-27 16:35:25.280: E/AndroidRuntime(6330):     at android.widget.AbsListView.onLayout(AbsListView.java:1147)
02-27 16:35:25.280: E/AndroidRuntime(6330):     at android.view.View.layout(View.java:7035)
02-27 16:35:25.280: E/AndroidRuntime(6330):     at android.widget.RelativeLayout.onLayout(RelativeLayout.java:909)
02-27 16:35:25.280: E/AndroidRuntime(6330):     at android.view.View.layout(View.java:7035)
02-27 16:35:25.280: E/AndroidRuntime(6330):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
02-27 16:35:25.280: E/AndroidRuntime(6330):     at android.view.View.layout(View.java:7035)
02-27 16:35:25.280: E/AndroidRuntime(6330):     at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
02-27 16:35:25.280: E/AndroidRuntime(6330):     at android.view.View.layout(View.java:7035)
02-27 16:35:25.280: E/AndroidRuntime(6330):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1045)
02-27 16:35:25.280: E/AndroidRuntime(6330):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
02-27 16:35:25.280: E/AndroidRuntime(6330):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-27 16:35:25.280: E/AndroidRuntime(6330):     at android.os.Looper.loop(Looper.java:123)
02-27 16:35:25.280: E/AndroidRuntime(6330):     at android.app.ActivityThread.main(ActivityThread.java:4627)
02-27 16:35:25.280: E/AndroidRuntime(6330):     at java.lang.reflect.Method.invokeNative(Native Method)
02-27 16:35:25.280: E/AndroidRuntime(6330):     at java.lang.reflect.Method.invoke(Method.java:521)
02-27 16:35:25.280: E/AndroidRuntime(6330):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
02-27 16:35:25.280: E/AndroidRuntime(6330):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
02-27 16:35:25.280: E/AndroidRuntime(6330):     at dalvik.system.NativeStart.main(Native Method)

アダプタ:

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

    @Override
            public View getView( int position, View convertView, ViewGroup parent ) {
                View v = convertView;
                CatalogItem item = getItem( position );

                if ( v == null ) {
                    LayoutInflater inflater = ( LayoutInflater ) mContext.getSystemService( Context.LAYOUT_INFLATER_SERVICE );

                    if ( item.header )
                        v = inflater.inflate( R.layout.sec_header, null );
                    else
                        v = inflater.inflate( R.layout.sec_item, null );
                }

                if ( item.header ) {
                    TextView header = ( TextView ) v.findViewById( R.id.listHeaderTV );
                    header.setText( item.name );
                    header.setEnabled( false );
                } else {
                    TextView sectionItem = ( TextView ) v.findViewById( R.id.listCreatureNameTV );
                    sectionItem.setText( item.name );
                }

                return v;
            }
4

2 に答える 2

2

getView()表示されるビューを生成することになっています。クリック イベントを取得するには、次のように OnItemClickListener を設定する必要があります。

new OnItemClickListener() {
    // @Override
     public void onItemClick(AdapterView<?> a, View v, int position, long id) {
         Toast.makeText(ListRecords.this,"Clicked item: " + position, Toast.LENGTH_LONG).show();
     }
     });

…とconvertView、とりあえず無視。

于 2013-02-28T00:24:47.157 に答える
1

うーん、サムの答えがどこに行ったのかわかりませんが、彼はこれら2つのメソッドgetItemViewType()とgetViewTypeCount()をオーバーライドすることについては正しかったです。私もこのページから助けを得ました:http://androidtrainningcenter.blogspot.com/2012/03/android-listview-with-section-header.html

これが私のために働くことになったコードです:

public View getView( int position, View convertView, ViewGroup parent ) {
        ViewHolder holder = null;
        int type = getItemViewType( position );

        if ( convertView == null ) {
            holder = new ViewHolder();
            switch( type ) {
                case TYPE_ITEM:
                    convertView = inflater.inflate( R.layout.sec_item, null );
                    holder.tv = ( TextView ) convertView.findViewById( R.id.listCreatureNameTV );
                    break;
                case TYPE_SEPARATOR:
                    convertView = inflater.inflate( R.layout.sec_header, null );
                    holder.tv = ( TextView ) convertView.findViewById( R.id.listHeaderTV );
                    break;
            }
            convertView.setTag( holder );
        } else {
            holder = ( ViewHolder ) convertView.getTag();
        }

        CatalogItem item = getItem( position );
        holder.tv.setText( item.name );

        return convertView;
    }

    public static class ViewHolder {
        public TextView tv;
    }
于 2013-02-28T01:39:29.433 に答える