Android Listview点赞问题关于图片重复问题

《最近做一个小功能遇到这么一个问题,listview 与 baseadapter结合使用,关于点赞的的时候 图片重复问题,比如:我在第1个item 点赞然后 心型换成了红色,但是以后每隔几个item就会出现一个红色的心,响应事件是对的,不知道哪出的问题,请大神解答”》

上面是一小哥在论坛中发的帖子遇到的问题,跟我遇到的问题一样,下面有很多热心的评论哥们给出了思路,我一想,原来这么简单啊。

先给出实现代码,最后再来讲思路好了。

这篇博客我重新编辑了一次,加上了动画和收藏的效果,评论的哥们说收藏和点赞不能同时进行,图片会错乱,我给了他思路,他还是没实现,哎,我还是再来一遍,修改修改吧,博主真是关心大家啊

效果图

MainActivity.java

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //模拟的数据内容集合 List<ContentBean> data = new ArrayList<ContentBean>(); for (int i = 0; i < 15; i++) { ContentBean bean = new ContentBean(); // 默认都给他们赋值当前都没有点赞 bean.setZanFocus(false); bean.setZanNum(i); // 默认都给他们赋值当前都没有收藏 bean.setShoucanFocus(false); bean.setShoucanNum(i); data.add(bean); } ListView listview = (ListView) findViewById(R.id.listview); listview.setAdapter(new MyAdapter(this,data)); } main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.zan.MainActivity" > <ListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="match_parent" > </ListView> </RelativeLayout> ContentBean.java public class ContentBean { private boolean zanFocus, shoucanFocus; private int zanNum, shoucanNum; public boolean isShoucanFocus() { return shoucanFocus; } public void setShoucanFocus(boolean shoucanFocus) { this.shoucanFocus = shoucanFocus; } public int getShoucanNum() { return shoucanNum; } public void setShoucanNum(int shoucanNum) { this.shoucanNum = shoucanNum; } public boolean isZanFocus() { return zanFocus; } public void setZanFocus(boolean zanFocus) { this.zanFocus = zanFocus; } public int getZanNum() { return zanNum; } public void setZanNum(int zanNum) { this.zanNum = zanNum; } } MyAdapter.java public class MyAdapter extends BaseAdapter { List<ContentBean> data = new ArrayList<ContentBean>(); Context context; public MyAdapter(Context context, List<ContentBean> data) { this.context = context; this.data = data; } @Override public int getCount() { return data.size();// 返回20条数据 } @Override public Object getItem(int arg0) { return data.get(arg0); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder holder; final ContentBean bean = data.get(position); if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.item, parent, false); holder = new ViewHolder(); holder.zan_img = (ImageView) convertView.findViewById(R.id.zan_img); holder.zan_num = (TextView) convertView.findViewById(R.id.zan_num); holder.shoucan_img = (ImageView) convertView.findViewById(R.id.shoucan_img); holder.shoucan_num = (TextView) convertView.findViewById(R.id.shoucan_num); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // 取出bean中当记录状态是否为true,是的话则给img设置focus点赞图片 if (bean.isZanFocus()) { holder.zan_img.setImageResource(R.drawable.zan_focus); } else { holder.zan_img.setImageResource(R.drawable.zan_release); } // 取出bean中当记录状态是否为true,是的话则给img设置release收藏图片 if (bean.isShoucanFocus()) { holder.shoucan_img.setImageResource(R.drawable.shoucang_focus); } else { holder.shoucan_img.setImageResource(R.drawable.shoucang_release); } // 设置赞的数量 holder.zan_num.setText(bean.getZanNum() + ""); //设置收藏的数量 holder.shoucan_num.setText(bean.getShoucanNum()+""); holder.zan_img.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 获取上次是否已经被点击 boolean flag = bean.isZanFocus(); // 判断当前flag是点赞还是取消赞,是的话就给bean值减1,否则就加1 if (flag) { bean.setZanNum(bean.getZanNum() - 1); } else { bean.setZanNum(bean.getZanNum() + 1); } // 反向存储记录,实现取消点赞功能 bean.setZanFocus(!flag); AnimationTools.scale(holder.zan_img); } }); holder.shoucan_img.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 获取上次是否已经被点击 boolean flag = bean.isShoucanFocus(); // 判断当前flag是收藏还是取收藏,是的话就给bean值减1,否则就加1 if (flag) { bean.setShoucanNum(bean.getShoucanNum() - 1); } else { bean.setShoucanNum(bean.getShoucanNum() + 1); } // 反向存储记录,实现取消收藏功能 bean.setShoucanFocus(!flag); //动画 AnimationTools.scale(holder.shoucan_img); } }); return convertView; } private class ViewHolder { private ImageView zan_img,shoucan_img; private TextView zan_num,shoucan_num; } } item.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="50dp" android:gravity="center" android:orientation="horizontal" > <ImageView android:id="@+id/zan_img" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/zan_num" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> AnimationTools.java public class AnimationTools { public static void scale(View v) { ScaleAnimation anim = new ScaleAnimation(1.0f, 1.5f, 1.0f, 1.5f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); anim.setDuration(300); v.startAnimation(anim); } }

代码其实很简单,稍作理解还是很容易弄懂的,我们在listview更新item中的数据的时候,一定要明白一个道理,不要在item的view中直接更改数据(刚开始做的时候我就是直接holder.zan_img.setImageResource(资源图片),发现往下滑动的时候,上一次的触摸记录被下面的item给复用了,造成了数据的混乱),不然会造成数据的混乱,要是明白的listview的工作原理的话,可能会更清楚的明白,listview每次加载的数据是当前屏幕的一屏数据(其实我了解的不多,但是在打印log的时候,发现log出来初始化的数据就是一屏的数据),当你如果直接去改变view的样式的话,你触摸的当前item会被下面还未出现的item给复用掉,我是这样理解的=-=。

时间: 2024-09-26 14:50:04

Android Listview点赞问题关于图片重复问题的相关文章

Android Listview点赞问题关于图片重复问题_Android

<最近做一个小功能遇到这么一个问题,listview 与 baseadapter结合使用,关于点赞的的时候 图片重复问题,比如:我在第1个item 点赞然后 心型换成了红色,但是以后每隔几个item就会出现一个红色的心,响应事件是对的,不知道哪出的问题,请大神解答"> 上面是一小哥在论坛中发的帖子遇到的问题,跟我遇到的问题一样,下面有很多热心的评论哥们给出了思路,我一想,原来这么简单啊. 先给出实现代码,最后再来讲思路好了. 这篇博客我重新编辑了一次,加上了动画和收藏的效果,评论的哥

Android ListView滑动过程中图片显示重复错乱闪烁的原因及解决方法

主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及ListView的缓存机制. 1.原因分析 ListView item缓存机制:为了使得性能更优,ListView会缓存行item(某行对应的View).ListView通过adapter的getView函数获得每行的item.滑动过程中, a. 如果某行item已经滑出屏幕,若该item不在缓存内,则put进缓存,否则更新缓存: b. 获取滑入屏幕的行item之前会先判断缓存中是否有可用的ite

Android ListView滑动过程中图片显示重复错位闪烁问题解决

主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及ListView的缓存机制.1.原因分析ListView item缓存机制:为了使得性能更优,ListView会缓存行item(某行对应的View).ListView通过adapter的getView函数获得每行的item.滑动过程中, a. 如果某行item已经滑出屏幕,若该item不在缓存内,则put进缓存,否则更新缓存: b. 获取滑入屏幕的行item之前会先判断缓存中是否有可用的item,

Android listview点赞问题分析_Android

最近这段时间一直在看Android,利用Listview去实现点赞功能 基本思路: 进入界面–>获取数据–> 在Listview中显示–> 通过map集合(position,boolean)保存每一行是否被点击–> 利用实体类去保存相应的对象–> get/set方法进行相应值得改变–> 点击一次,相应的数量加1 只实现了点赞功能,踩和赞基本类似. 具体实现如下: 继承自BaseAdapter package com.gz.test_listview; import an

Android ListView异步加载图片方法详解_Android

本文实例讲述了Android ListView异步加载图片方法.分享给大家供大家参考,具体如下: 先说说这篇文章的优点把,开启线程异步加载图片,然后刷新UI显示图片,而且通过弱引用缓存网络加载的图片,节省了再次连接网络的开销. 这样做无疑是非常可取的方法,但是加载图片时仍然会感觉到轻微的卡屏现象,特别是listview里的item在进行快速滑动的时候. 我找了一下原因,可能是在listview快速滑动屏幕的时候划过的item太多 而且每次调用getView方法后就会异步的在过去某个时间内用han

Android ListView异步加载图片方法详解

本文实例讲述了Android ListView异步加载图片方法.分享给大家供大家参考,具体如下: 先说说这篇文章的优点把,开启线程异步加载图片,然后刷新UI显示图片,而且通过弱引用缓存网络加载的图片,节省了再次连接网络的开销. 这样做无疑是非常可取的方法,但是加载图片时仍然会感觉到轻微的卡屏现象,特别是listview里的item在进行快速滑动的时候. 我找了一下原因,可能是在listview快速滑动屏幕的时候划过的item太多 而且每次调用getView方法后就会异步的在过去某个时间内用han

android listview点赞问题

<最近做一个小功能遇到这么一个问题,listview 与 baseadapter结合使用,关于点赞的的时候 图片重复问题,比如:我在第1个item 点赞然后 心型换成了红色,但是以后每隔几个item就会出现一个红色的心,响应事件是对的,不知道哪出的问题,请大神解答"> 上面是一小哥在论坛中发的帖子遇到的问题,跟我遇到的问题一样,下面有很多热心的评论哥们给出了思路,我一想,原来这么简单啊. 先给出实现代码,最后再来讲思路好了. 这篇博客我重新编辑了一次,加上了动画和收藏的效果,评论的哥

解决Android ListView异步加载图片乱序问题

在Android所有系统自带的控件当中,ListView这个控件算是用法比较复杂的了,关键是用法复杂也就算了,它还经常会出现一些稀奇古怪的问题,让人非常头疼.比如说在ListView中加载图片,如果是同步加载图片倒还好,但是一旦使用异步加载图片那么问题就来了,这个问题我相信很多Android开发者都曾经遇到过,就是异步加载图片会出现错位乱序的情况.遇到这个问题时,不少人在网上搜索找到了相应的解决方案,但是真正深入理解这个问题出现的原因并对症解决的人恐怕还并不是很多.那么今天我们就来具体深入分析一

Android ListView 异步加载图片

http://www.iteye.com/topic/1118828 http://www.iteye.com/topic/1127914 先说说这篇文章的优点把,开启线程异步加载图片,然后刷新UI显示图片,而且通过弱引用缓存网络加载的图片,节省了再次连接网络的开销. 这样做无疑是非常可取的方法,但是加载图片时仍然会感觉到轻微的卡屏现象,特别是listview里的item在进行快速滑动的时候. 我找了一下原因,可能是在listview快速滑动屏幕的时候划过的item太多 而且每次调用getVie