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给复用掉,我是这样理解的=-=。



说点题外话^-^,今天是2016年3月4日,今年在安徽淮师读大二,刚去外面拿了两个快递,说这么多无用的,是为了以后看见的时候知道我现在在干嘛,哈哈。第一次写博客,还是很开心的,等以后再翻出来又会是一次美好的记忆。从去年就开始蠢蠢欲动想在csdn和大家一起分享经验,可都没有实现,确实是一个遗憾。
之前还是看博客看的多,鸿洋大神的博客看的最多,也学习了不少的东西,还有aige的博客也不能少^=^,自定义view讲的是很不错的。
学安卓的这一路上,一个人走确实挺累的,没有人教,没有人讨论,碰壁总是在所难免的,后来看了鸿洋的博客,加了他的群,认识了很多的开发者,我们彼此交流自己的经验,帮助大家解决问题,很是一种享受。希望以后能跟进大牛们的脚步,努力前进。

时间: 2024-09-27 12:37:03

android listview点赞问题的相关文章

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

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

Android listview点赞问题分析_Android

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

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

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

Android中Listview点赞功能的实现

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

Android ListView与适配器

练习:实现如下图新闻列表, 并且添加点赞,且点击点赞.点攒数增加, 点击图片显示已点击了图片. 布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:l

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

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

Android ListView的一个问题

需要的功能很简单,就是一个带checkbox的列表,提交时需要知道用户选择了那些项目,如下图: 使用SimpleAdapter作为数据适配器,重写SimpleAdapter.ViewBinder的方法,这样用比自定义Adapter要方便点,代码如下 datas定义是private List<Map<String, Object>> datas=null; 其中让Map中保存一项自我引用(my)绑定到checkBox private Map<String, Object>

android listview的headview

问题描述 android listview的headview 用别人的headview,为什么我的headview只显示了一半..是不是哪里设置问题 解决方案 解决了,listview的布局有个地方用了wrap_content,换成match_parent就好了 解决方案二: 明显是布局出了问题,改一下图片的伸缩方式就可以了 解决方案三: 你的布局拿出来看看,可能是高度设置有问题 解决方案四: <?xml version="1.0" encoding="utf-8&qu

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

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