Android的列表视图的位置上选择的项目为0 [英] Android Listview Position is 0 on item selection

查看:147
本文介绍了Android的列表视图的位置上选择的项目为0的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个自定义适配器为我的列表视图(扩展ArrayAdapter)。该列表加载罚款。然而,当我点击一个项目在我的名单,也就是说,在列表中的第五项,在getView的位置总是0,而不是5.崩溃,因为 convertView 无再如果为0,则变量应该被初始化为 R.id .listHeaderTv TextView的,但它不能找到它,并最终被空。搜索结果我如何修复位置问题和 convertView 不是空了?

编辑:检查onItemClick方法后,该位置是正确的。那么唯一的问题是,onItemClick方法后,getView被调用和崩溃,因为有观点不被夸大了。

logcat的:

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

适配器:

  @覆盖
        公众诠释的getCount(){
            返回catalog.size();
        }    @覆盖
            公共查看getView(INT位置,查看convertView,父母的ViewGroup){
                视图V = convertView;
                CatalogItem项目=的getItem(位置);                如果(V == NULL){
                    LayoutInflater吹气=(LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);                    如果(item.header)
                        V = inflater.inflate(R.layout.sec_header,NULL);
                    其他
                        V = inflater.inflate(R.layout.sec_item,NULL);
                }                如果(item.header){
                    TextView的头=(TextView中)v.findViewById(R.id.listHeaderTV);
                    header.setText(item.name);
                    header.setEnabled(假);
                }其他{
                    TextView的sectionItem =(TextView中)v.findViewById(R.id.listCreatureNameTV);
                    sectionItem.setText(item.name);
                }                返回伏;
            }


解决方案

嗯,不知道从哪里萨姆的回答了,但他了解重写这两种方法getItemViewType()和getViewTypeCount()是正确的。我也得到了帮助,从这个页面:的http://androidtrainningcenter.blogspot.com/2012/03/android-listview-with-section-header.html

这里的code,它结束了为我工作:

 公共查看getView(INT位置,查看convertView,父母的ViewGroup){
        ViewHolder支架=无效;
        整型= getItemViewType(位置);        如果(convertView == NULL){
            持有人=新ViewHolder();
            开关(类型){
                案例TYPE_ITEM:
                    convertView = inflater.inflate(R.layout.sec_item,NULL);
                    holder.tv =(TextView中)convertView.findViewById(R.id.listCreatureNameTV);
                    打破;
                案例TYPE_SEPARATOR:
                    convertView = inflater.inflate(R.layout.sec_header,NULL);
                    holder.tv =(TextView中)convertView.findViewById(R.id.listHeaderTV);
                    打破;
            }
            convertView.setTag(保持器);
        }其他{
            支架=(ViewHolder)convertView.getTag();
        }        CatalogItem项目=的getItem(位置);
        holder.tv.setText(item.name);        返回convertView;
    }    公共静态类ViewHolder {
        公众的TextView的电视;
    }

I have a custom adapter for my list view (extends ArrayAdapter). The list loads fine. However, when I click on an item in my list, i.e. the 5th item in the list, the position in getView is always 0 instead of 5. It crashes because convertView is no longer null If it is 0, the headervariable should be initialized to the R.id.listHeaderTv TextView, but it can't find it and ends up being null.

How do I fix the position problem and convertView not being null anymore?

EDIT: After checking onItemClick method, the position is correct. The only problem then is that after the onItemClick method, getView is being called and crashes there because the view is not being inflated.

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)

Adapter:

@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;
            }

解决方案

Hm, don't know where Sam's answer went but he was correct about overriding those two methods getItemViewType() and getViewTypeCount(). I also got help from this page: http://androidtrainningcenter.blogspot.com/2012/03/android-listview-with-section-header.html

Here's the code that ended up working for me:

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;
    }

这篇关于Android的列表视图的位置上选择的项目为0的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆