关于ListView数据显示错乱的解决方案

原创 2016年10月04日 15:57:22

我们在平常开发Android中经常用到listview, 然而, 这个空间如果不进行优化的写法, 是非常吃内存的. 但是google在2013年IO大会上提出的viewholder写法显然已经是现在的优化标准了, 然而这个优化带来的烦恼也挺多的.
首先使用viewholder优化其实就是复用的创建好的item, 然后如果我们在创建好的item上面现实图片或者是在条目上做一些操作显然BUG是挺多的, 比如:我们listview显示的item里面是从网络获取的图片, 那么我们用viewholder优化后, 滑动listview图片会错乱, 会闪烁; 再比如, 我们常见的点赞操作, 我点击某一个条目, 它会给该条目设置一个标识, 然后当我在滑动的时候, 你会发现很奇怪, 怎么下面的item也会有该标识.
这里写图片描述

所以我们为了让listview做到尽量节约内存, 我们还是使用这个优化方案, 反之, 他出现的bug也要解决掉.

如果是网络请求获取图片显示在listview上面, 我们可以设置标签, 也就是tag, 可以使用他的URL来做他的标签, 然后加一个 if, else判断, 假如我们要在item上面做一些操作,
比如加载的是本地的图片, 假设我现在点击listview的条目, 要在条目上显示一个图片 类似于空间微信点赞操作, 那么我们应该怎么做?
这里写图片描述

package com.himan.blogdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import org.w3c.dom.Text;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {


    private ListView lv_test;
    private List<CheckBean> strList;
    private StrListAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv_test = (ListView) findViewById(R.id.lv_test);
        strList = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            strList.add(new CheckBean(false, "item"+i));
        }
        adapter = new StrListAdapter();
        lv_test.setAdapter(adapter);
    }


    class StrListAdapter extends BaseAdapter {

        ViewHolder holder;

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

        @Override
        public Object getItem(int position) {
            return strList.get(position);
        }

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

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                convertView = View.inflate(MainActivity.this, R.layout.list_item_layout, null);
                holder = new ViewHolder(convertView);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            final CheckBean bean = strList.get(position);
            if(bean.isClick()){
                holder.iv_check.setVisibility(View.VISIBLE);
            }else{
                holder.iv_check.setVisibility(View.GONE);
            }

            holder.tv_content.setText(strList.get(position).getStr());

            holder.rl_items.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    bean.setClick(!bean.isClick());
                    notifyDataSetChanged();
                }
            });

            return convertView;
        }
    }


    class ViewHolder {
        TextView tv_content;
        ImageView iv_check;
        RelativeLayout rl_items;

        public ViewHolder(View view) {
            tv_content = (TextView) view.findViewById(R.id.tv_content);
            iv_check = (ImageView) view.findViewById(R.id.iv_check);
            rl_items = (RelativeLayout) view.findViewById(R.id.rl_items);
        }
    }
}

这个是MainActivity代码, List的类型正是我创建的bean类的类型

package com.himan.blogdemo;

/**
 * Created by HIMan on 2016/10/4.
 */

public class CheckBean {

    private boolean isClick;
    private String str;

    public CheckBean(boolean isClick, String str) {
        this.isClick = isClick;
        this.str = str;
    }

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }

    public boolean isClick() {
        return isClick;
    }

    public void setClick(boolean click) {
        isClick = click;
    }
}

在convertView里面做判断的时候有if同时也要有else, 这样不会有bug也会更严谨一些, 另外如果加载网络图片的话使用第三方库好多都有带防止图片错乱机制, 如果没有的话, 我们直接可以setTag(), 然后在根据getTag()来判断刚才的tag值, 可以用URL作为tag, 用法上大同小异.

——-代码下载——–

版权声明:本文为博主原创文章,未经博主允许不得转载。

android-分页加载ListView 点击Item获取对象数据及ArrayList重复及乱序问题

> 多页ListView,点击Item获取对象数据   保证ArrayList集合的唯一性,注意清空集合(使用ArrayList适配时) > ArrayList重复及乱序问题   可能是...
  • ShareUs
  • ShareUs
  • 2015年12月23日 14:29
  • 821

Android 解决Listview条目里面有Edittext数据错乱问题

当Listview的条目里面有EditText,如果数据很多的情况下,编辑数据后上下滑动,发现数据会错乱了。。。。 Activity里面就一个更新数据的方法: /** * 更新数据 ...
  • QQ55214
  • QQ55214
  • 2016年05月21日 19:47
  • 2026

Android 解决在ListView历史复用中数据显示混乱

如图所示,我们做了个提交评价功能,而UI设计让我们逐个评论,商量后还是要保持这样,那我们就只能按照这样的实现,那么这就用一个listview列表显示,item里面有好评差评textview,自定义星星...
  • qq_22893335
  • qq_22893335
  • 2017年02月13日 13:03
  • 204

Android记录21-关于ListView数据错乱的解决方案

前言 本篇博客要给大家分享的是在Android开发中遇到滑动数据错乱的问题如何解决,先描述一些为什么会出现数据错乱,熟悉ListView复用原因的朋友一定知道,我们在开发中为了优化数据显示,...
  • wwj_748
  • wwj_748
  • 2015年02月04日 12:22
  • 21061

listview数据错乱、重复的原因分析与解决方案

目前我们使用listview展示数据时,adapter的getView方法通常使用convertView.setTag(viewHolder)的方式来避免出现卡顿的情况,这种方式能使convertVi...
  • whsdu929
  • whsdu929
  • 2016年09月21日 10:27
  • 1975

如何解决ListView中EditText的数据加载错乱的问题?

问题描述 ListView中EditText的每个Item都有一个EditText,当在第一个EditText里面输入数据,比如1234时,滚动ListView到下面时,会在第3个EditText...
  • mengmakies
  • mengmakies
  • 2016年05月19日 10:03
  • 1029

listview的某个item点击显示或隐藏的错乱问题解决方法

看到自己写的文章被越来越多的人阅读真的很开心,付出的时间都是值得的,另外就是希望大家批评指正,如果做得不好希望被指出,对大家有帮助也希望被给予鼓励。今天给大家分享listview的某个item点击显示...
  • yu_er_
  • yu_er_
  • 2016年04月24日 15:15
  • 1005

ListView优化机制及滑动时数据时出现的数据错乱重复问题

该篇内容主要是记录我在实际开发中遇到的ListView滑动时数据错乱的几种情况,以及解决方法。在进行ListView滑动时数据错乱问题讨论之前会对ListView所谓的进行说明。文章末尾分享了几篇文章...
  • huanongjingchao
  • huanongjingchao
  • 2015年01月20日 15:50
  • 42294

android - ListView优化机制及滑动时数据时出现的数据错乱重复问题

目录(?)[+] 该篇内容主要是记录我在实际开发中遇到的ListView滑动时数据错乱的几种情况,以及解决方法。在进行ListView滑动时数据错乱问题讨论之前会对ListView所谓的进行说明...
  • u012246458
  • u012246458
  • 2016年01月25日 20:41
  • 2973

android listview图片错位原理及解决方法

最近去面试被问到了listview中图片错位的原因,而我一直在往viewholder和tag机制上聊(被虐了),其实viewholder和tag机制只是解决图片错位的方法,而非产生图片错位的原理,回来...
  • a394268045
  • a394268045
  • 2016年02月23日 22:30
  • 6682
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于ListView数据显示错乱的解决方案
举报原因:
原因补充:

(最多只允许输入30个字)