admin管理员组文章数量:1611399
首先,我遇到的问题是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 comease.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);
}
}
本文标签: 根本原因异常解决了AdapterListView
版权声明:本文标题:ListView的Adapter在getView()的时候position始终为0,异常解决了,求解答根本原因 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1728607698a1165659.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论