ListView的Adapter在getView()的时候position始终为0,异常解决了,求解答根本原因

首先,我遇到的问题是Adapter的数据没有问题,但是在调用getView(int position, View convertView, ViewGroup parent)这个方法的时候,Position始终为0.如果你也遇到了,可以看看我整个解决的过程,权当一个反面教材:

一开始,当我看到我的ListView不能显示完整的内容时,我是怀疑是Adapter的问题,于是我将Adapter选择了我之前在其它地方能正常复用的一个Adapter,但是还是不行,接着我在数据源实例化的时候做了非空判断,检查得到的数据是否为空。

 mData = recents;

                for (RecentContact recentContact : mData) 
                {
                    if(recentContact!=null)
                    {
                         Log.i(TAG, "RecentContact:"+recentContact.getFromNick());
                    }
                }

上一步判断没有问题之后,接着在拿到数据后我实例化Adapter:

    private void initAdapter() 
    {
        adapter = new CommonAdapter<RecentContact>(context,mData,R.layout.main_session_item) {

             @Override
            public void convert(ViewHolder helper, RecentContact item) 
            {
                SimpleDateFormat sdf = new SimpleDateFormat("hh:mm");
                helper.setImageBitmap(R.id.session_listview_person_photo,
                        Utils.createCircleImage(context, 
                                R.drawable.avatar_def, 54));
                helper.setText(R.id.session_listview_person_name, item.getFromNick());
                helper.setText(R.id.session_listview_person_text, item.getContent());
                helper.setText(R.id.session_listview_person_time, sdf.format(new Date(item.getTime())));
            }

            @Override
            public void getNO1View(View convertView, ViewHolder helper,
                    RecentContact item)
            {
                convert(helper, item);

            }
        };

    }

这里没有日志输出,因为我的日志都是在这个复用的类里面来写的,接着看看这个万能适配器Adapter里面的两个地方:

 @Override
    public int getCount() 
    {
        Log.i("TestDebug", "getCount():"+data.size());
        for (int i = 0; i < data.size(); i++) 
        {
            RecentContact item = (RecentContact) data.get(i);
            if(item!=null)
            {
                Log.i("TestDebug", "getCount():----item"+item.getFromNick());
            }
        }
        return data.size();
    }
  @Override
    public View getView(int position, View convertView, ViewGroup parent) 
    {
        ViewHolder viewHolder = getViewHolder(position, convertView, parent,mItemLayoutId);
        Log.i("TestDebug", "getView():---->position"+position+"\ndata:"+data.size());
        if(position==0)
        {
            getNO1View(convertView, viewHolder, data.get(position));
        }
        else 
        {
            convert(viewHolder, data.get(position));
        }

        return viewHolder.getConvertView();
    }

大家看到我对Adapter里面的数据都做了检查,得到的日志输出也显示我的数据是没有问题的:

07-16 22:16:02.640: I/TestDebug(2482): initMessage
07-16 22:16:02.648: I/TestDebug(2482): onResume()
07-16 22:16:02.804: I/TestDebug(2482): RecentContact:Debug
07-16 22:16:02.804: I/TestDebug(2482): RecentContact:杰克
07-16 22:16:02.808: I/TestDebug(2482): RecentContact:苏灿烤鱼
07-16 22:16:02.812: I/TestDebug(2482): getCount():3
07-16 22:16:02.812: I/TestDebug(2482): getCount():----itemDebug
07-16 22:16:02.812: I/TestDebug(2482): getCount():----item杰克
07-16 22:16:02.812: I/TestDebug(2482): getCount():----item苏灿烤鱼
07-16 22:16:02.812: I/TestDebug(2482): getCount():3
07-16 22:16:02.812: I/TestDebug(2482): getCount():----itemDebug
07-16 22:16:02.812: I/TestDebug(2482): getCount():----item杰克
07-16 22:16:02.816: I/TestDebug(2482): getCount():----item苏灿烤鱼
07-16 22:16:02.816: I/TestDebug(2482): getCount():3
07-16 22:16:02.820: I/TestDebug(2482): getCount():----itemDebug
07-16 22:16:02.820: I/TestDebug(2482): getCount():----item杰克
07-16 22:16:02.820: I/TestDebug(2482): getCount():----item苏灿烤鱼
07-16 22:16:02.844: I/TestDebug(2482): getView():---->position0
07-16 22:16:02.844: I/TestDebug(2482): data:3
07-16 22:16:02.852: I/TestDebug(2482): getCount():3
07-16 22:16:02.852: I/TestDebug(2482): getCount():----itemDebug
07-16 22:16:02.852: I/TestDebug(2482): getCount():----item杰克
07-16 22:16:02.852: I/TestDebug(2482): getCount():----item苏灿烤鱼
07-16 22:16:02.852: I/TestDebug(2482): getView():---->position0
07-16 22:16:02.852: I/TestDebug(2482): data:3
07-16 22:16:03.012: I/TestDebug(2482): getCount():3
07-16 22:16:03.012: I/TestDebug(2482): getCount():----itemDebug
07-16 22:16:03.012: I/TestDebug(2482): getCount():----item杰克
07-16 22:16:03.012: I/TestDebug(2482): getCount():----item苏灿烤鱼
07-16 22:16:03.012: I/TestDebug(2482): getView():---->position0
07-16 22:16:03.012: I/TestDebug(2482): data:3
07-16 22:16:03.364: I/TestDebug(2482): getCount():3
07-16 22:16:03.364: I/TestDebug(2482): getCount():----itemDebug
07-16 22:16:03.368: I/TestDebug(2482): getCount():----item杰克
07-16 22:16:03.368: I/TestDebug(2482): getCount():----item苏灿烤鱼
07-16 22:16:03.380: I/TestDebug(2482): getView():---->position0
07-16 22:16:03.380: I/TestDebug(2482): data:3
07-16 22:16:03.420: I/TestDebug(2482): getCount():3
07-16 22:16:03.420: I/TestDebug(2482): getCount():----itemDebug
07-16 22:16:03.420: I/TestDebug(2482): getCount():----item杰克
07-16 22:16:03.420: I/TestDebug(2482): getCount():----item苏灿烤鱼
07-16 22:16:03.420: I/TestDebug(2482): getView():---->position0
07-16 22:16:03.420: I/TestDebug(2482): data:3
07-16 22:16:03.580: I/TestDebug(2482): getCount():3
07-16 22:16:03.580: I/TestDebug(2482): getCount():----itemDebug
07-16 22:16:03.580: I/TestDebug(2482): getCount():----item杰克
07-16 22:16:03.580: I/TestDebug(2482): getCount():----item苏灿烤鱼

然后就陷入了死循环,因为这个问题我从来没有遇到过,我之前培训机构的老师也怀疑这是数据源的问题,于是我对数据重新构造了实体类,但是效果还是一样。在各种细节纠结了两天无果后,我使用了老办法:单独写一个项目,然后对ListView、Adapter和实体类以及数据源进行运用,发现这个项目是没有问题的,ListView能显示所有内容。

于是我反推回去,当Adapter没有问题,数据源一样,于是我检查对ListView,看看是不是对它进行了什么特别设置?打开进去发现ListView的配置参数完全一样,无非就是宽高再加一个ID,都是最基础的配置,但是在ListView的父布局则完全不一样,能正常使用的布局是LinerLayout,而我不能正常使用的布局是ScrollView,我也不知道当时脑袋被门夹了还是敲代码没有睡醒,要对其设置这个布局,因为我正常使用过程中不需要自动扩展,ListView自己也是支持自动扩展的。于是我修改过来,随手写了一个LinerLayout作为父布局,Adapter在getView(int position, View convertView, ViewGroup parent)这个方法的Position始终为0就解决了!

理论上来讲,问题是解决了,但是实际上这个小问题花了两天时间才解决跟自己不善于思考有关,我正常的解决方法应该是遇到问题,然后重新写一个项目,对遇到的因素进行再次排查,如果如Adapter存在问题,很快就可以解决,但是我以为我当时已经换过一次Adapter了,所以就没有继续按照这个思路去解决,这是一个需要避免的问题。

最后的问题是,为什么ScrollView里面的ListView在调用Adapter的getView(int position, View convertView, ViewGroup parent)这个方法时,position始终为0,这个是根本原因是什么呢?求各位看官帮忙解答,谢谢!!!

最后如果大家对于Adapter实例化有疑问,可以看看这篇文章:Android 快速开发系列 打造万能的ListView GridView 适配器
我的Adapter适配器内容不是很多,大家有兴趣可以看看:
ViewHolder类:

package com.weixing.myofwechat.adapter;

import android.content.Context;
import android.graphics.Bitmap;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

public class ViewHolder 
{

        private final SparseArray<View> mViews;  
    private static  View mConvertView;

        private ViewHolder(Context context, ViewGroup parent, int layoutId,  
            int position)
        {
                this.mViews = new SparseArray<View>();
                mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false);
                mConvertView.setTag(this);
        }
        /**
         * 获取ViewHolder
         * @param context
         * @param parent
         * @param layoutId
         * @param position
         * @return
         */
        public static ViewHolder getViewHolder(Context context, ViewGroup parent, int layoutId,  
            int position)
        {
                if(mConvertView == null)
                {
                        new ViewHolder(context, parent, layoutId, position);

                }
                return (ViewHolder) mConvertView.getTag();

        }
        /**
         * 通过ViewId获取View控件
         * @param viewId
         * @return
         */
        public <T extends View> T getView(int viewId)
        {

                View view = mViews.get(viewId);
                if(view==null)
                {
                        view = mConvertView.findViewById(viewId);
                        mViews.put(viewId, view);
                }
                return (T) view;

        }
        /**
         * 获取ConvertView
         * @return
         */
        public View getConvertView()
        {
                return mConvertView;

        }

        /** 
     * 为TextView设置字符串 
     *  
     * @param viewId 
     * @param text 
     * @return 
     */  
    public ViewHolder setText(int viewId, String text)  
    {  
        TextView view = getView(viewId);  
        view.setText(text);  
        return this;  
    }  

    /** 
     * 为ImageView设置图片 
     *  
     * @param viewId 
     * @param drawableId 
     * @return 
     */  
    public ViewHolder setImageResource(int viewId, int drawableId)  
    {  
        ImageView view = getView(viewId);  
        view.setImageResource(drawableId);  

        return this;  
    }  

    /** 
     * 为ImageView设置图片 
     *  
     * @param viewId 
     * @param drawableId 
     * @return 
     */  
    public ViewHolder setImageBitmap(int viewId, Bitmap bm)  
    {  
        ImageView view = getView(viewId);  
        view.setImageBitmap(bm);  
        return this;  
    }  

    /** 
     * 为ImageView设置图片 
     *  
     * @param viewId 
     * @param drawableId 
     * @return 
     */  
    public ViewHolder setImageByUrl(int viewId, String url)  
    {  
//        ImageLoader.getInstance(3, Type.LIFO).loadImage(url,  
//                (ImageView) getView(viewId));  
        return this;  
    }  
}

BaseAdapter抽象类

package com.weixing.myofwechat.adapter;

import java.util.List;

import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import com.netease.nimlib.sdk.msg.model.RecentContact;
import com.weixing.myofwechat.adapter.abslistview_base.ViewHolder;

public abstract class CommonAdapter<T> extends BaseAdapter
{
        private List<T> data = null;
        private Context context;
        private final int mItemLayoutId;

        public CommonAdapter(Context context,List<T> data, int itemLayoutId)
        {
                this.data = data;
                this.context = context;
                this.mItemLayoutId = itemLayoutId;
        }

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

        @Override
        public T getItem(int position) 
        {
                return data.get(position);
        }

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

        //普通行设置
        public abstract void convert(ViewHolder helper, T item);  
        //第一行特殊设置
        public abstract void getNO1View(View convertView,ViewHolder helper, T item);
        @Override
        public View getView(int position, View convertView, ViewGroup parent) 
        {
                ViewHolder viewHolder = getViewHolder(position, convertView, parent,mItemLayoutId);
                if(position==0)
                {
                        getNO1View(convertView, viewHolder, data.get(position));
                }
                else 
                {
                        convert(viewHolder, data.get(position));
                }

                return viewHolder.getConvertView();
        }



        private ViewHolder getViewHolder(int position, View convertView,  
            ViewGroup parent,int layoutId)
        {
                return ViewHolder.get(context, convertView, parent, layoutId, position);

        }
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值