android 关于ListView Item数据混乱问题

android 心得与问题 专栏收录该内容
3 篇文章 0 订阅
这个问题关系到一个软件的成败,为什么这么说呢?因为ListView是andriod主要的展示数据的方式,所以我们用的最多的也就是ListView.而如果ListView有问题,那不就是最大的问题.
这几天被经理骂了,是啊,做什么都要做好来,而不是马马乎乎的.细节决定成败.自己想到的问题,一定要自己去弄出来,而不是交给测试员去弄.
今天讲的这个问题是关于ListView数据混乱的问题.问题是这样的,数据已经展示在了ListView上的时候,当我们拉动ListView.每个Item项的数据会变动.如下图:
android <wbr>关于ListView <wbr>Item数据混乱问题这是没有拖动时的数据.当我拖动ListView时,变成了如下图:
android <wbr>关于ListView <wbr>Item数据混乱问题
数据在变来变去.
想了很久也不知道在哪里出了问题,最后经理终于发现了我的问题.问题有三点:
第一.
我的ViewHolder写的有问题.如下:
private class ViewHodler
{
public static TextView t_Subject;
public static TextView t_Author;
public static TextView t_Dateline;
public static ImageView t_photo;
public static TextView t_Replies;
}
我将ViewHodler里的每个属性都设置成了static.
static,说明只用一个内存空间,而getView时,每个Item的数据不一样,所以不能用static
第二.
没有重置ViewHodler.
if (convertView == null)
{
LayoutInflater inflater = getLayoutInflater();
convertView = inflater.inflate(R.layout.m_digesttopiclist_item,
null);
hodler = new ViewHodler();
hodler.t_Subject = (TextView) convertView
.findViewById(R.m_digesttopicid.subject);
hodler.t_Author = (TextView) convertView
.findViewById(R.m_digesttopicid.author);
hodler.t_Dateline = (TextView) convertView
.findViewById(R.m_digesttopicid.dateline);
hodler.t_photo = (ImageView) convertView
.findViewById(R.m_digesttopicid.userimage);
hodler.t_Replies = (TextView) convertView
.findViewById(R.m_digesttopicid.replies);
hodler.t_photo.setTag(oAuthorphoto);
convertView.setTag(hodler);
}else {
hodler = (ViewHodler) convertView.getTag();
resetViewHolder(hodler);
}
protected void resetViewHolder(ViewHodler p_ViewHolder)
{
p_ViewHolder.t_Subject.setText(null);
p_ViewHolder.t_Author.setText(null);
p_ViewHolder.t_Dateline.setText(null);
p_ViewHolder.t_photo.setImageDrawable(null);
p_ViewHolder.t_Replies.setText(null);
}
第三.
头像没有绑定tag
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHodler hodler = null;
String oTid =null;
String oSubject = null;
String oAuthor = null;
String oDateline = null;
String oReplies = null;
String odateStr = null;
String oAuthorphoto=null;
try
{
ExtJSONObject oDigestItem  = mForumJsonArray.getExtJSONObject(position);
oTid = oDigestItem.getString("tid");
oSubject = oDigestItem.getString("subject");
oAuthor = oDigestItem.getString("author");
oDateline =oDigestItem.getString("dateline");
odateStr = AppUtility.formatRelativeTime(Integer
.parseInt(oDateline));
Log.i("TAG", "date= " + oDateline);
oReplies = oDigestItem.getString("replies");
oAuthorphoto=oDigestItem.getString("authorid");
}
catch (JSONException e)
{
e.printStackTrace();
}
if (convertView == null)
{
LayoutInflater inflater = getLayoutInflater();
convertView = inflater.inflate(R.layout.m_digesttopiclist_item,
null);
hodler = new ViewHodler();
hodler.t_Subject = (TextView) convertView
.findViewById(R.m_digesttopicid.subject);
hodler.t_Author = (TextView) convertView
.findViewById(R.m_digesttopicid.author);
hodler.t_Dateline = (TextView) convertView
.findViewById(R.m_digesttopicid.dateline);
hodler.t_photo = (ImageView) convertView
.findViewById(R.m_digesttopicid.userimage);
hodler.t_Replies = (TextView) convertView
.findViewById(R.m_digesttopicid.replies);
hodler.t_photo.setTag(oAuthorphoto);
convertView.setTag(hodler);
}else {
hodler = (ViewHodler) convertView.getTag();
resetViewHolder(hodler);
}

hodler.t_Subject.setText(oSubject);
hodler.t_Dateline.setText(odateStr);
hodler.t_Author.setText(oAuthor);
hodler.t_Replies.setText(oReplies);
hodler.t_Replies.setGravity(Gravity.CENTER);
hodler.t_photo.setTag(oTid);
String userFaceUrl=AppUtility.getResourceString(R.string.apiuserphotourl)+"uid="+oAuthorphoto+"&size=middle";
this.setImageValue(hodler.t_photo,oTid,userFaceUrl,100, 100, R.drawable.m_newestlistimage,-1);

return convertView;
}
 
 
 
 
总结:
以上是前辈说的解决方法,刚好本人也遇到,就记录下来。
归根结底,对getView的优化方面原理还是有点理解不清楚,要加强!!!
  • 0
    点赞
  • 2
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页

打赏

logo616

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值