最近这段时间一直在看Android,利用Listview去实现点赞功能,下面给大家介绍下基本思路。

基本思路:

进入界面–》获取数据–》

在Listview中显示–》

通过map集合(position,boolean)保存每一行是否被点击–》

利用实体类去保存相应的对象–》

get/set方法进行相应值得改变–》

点击一次,相应的数量加1

只实现了点赞功能,踩和赞基本类似。

具体实现如下:

继承自BaseAdapter

package com.gz.test_listview;

import android.content.Context;

import android.content.DialogInterface;

import android.content.Intent;

import android.os.Handler;

import android.os.Message;

import android.util.Log;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.AdapterView;

import android.widget.BaseAdapter;

import android.widget.Button;

import android.widget.ImageView;

import android.widget.ListView;

import android.widget.TextView;

import android.widget.Toast;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

/**

* Created by gz on 2016/11/9.

*/

public class MainActivityAdapter extends BaseAdapter{

//用来获取界面上的元素

private ViewHolder holder;

private Context context;

//这里的Bean是个测试用的内部类,将点赞数和踩得数存起来,可以定义一个类,

//直接获取数据就好,需要改进下

private List praise_step_num = new ArrayList();

private LayoutInflater inflater;

//保存当前点赞数

List> listItems;

/*

根据position,保存点击的是哪一行数据,默认为false,点击后改为true

*/

private Map isExist = new HashMap();

public MainActivityAdapter(Context context,List> listItems){

this.context = context;

this.listItems = listItems;

inflater = LayoutInflater.from(context);

Log.i("listItem",listItems.toString());

init();

}

private void init() {

/*

为相应的数据赋值,所有的数据存储在listItems中

position一一对应每一行数据

*/

for (int i = 0;i

isExist.put(i,false);

Bean b = new Bean();

Integer praise = Integer.parseInt(listItems.get(i).get("praise").toString());

b.setPraise(praise);

Integer step = Integer.parseInt(listItems.get(i).get("step").toString());

b.setStep(step);

praise_step_num.add(i,b);

Log.i("praise_step",praise_step_num.get(i).getPraise()+"");

}

}

@Override

public int getCount() {

return listItems.size() ;

}

@Override

public Object getItem(int position) {

return position;

}

@Override

public long getItemId(int position) {

return position;

}

@Override

public View getView(final int position, View convertView, ViewGroup parent) {

//获取赞、踩得值

final Bean bean = praise_step_num.get(position);

if(convertView == null){

holder = new ViewHolder();

convertView = inflater.inflate(R.layout.item_praise,null);

holder.img_praise = (ImageView) convertView.findViewById(R.id.tv_praises_img);

holder.img_step = (ImageView) convertView.findViewById(R.id.tv_step_img);

holder.praise = (TextView) convertView.findViewById(R.id.tv_praises);

holder.step = (TextView) convertView.findViewById(R.id.tv_step);

holder.title = (TextView) convertView.findViewById(R.id.tv_name);

//holder.img_step.setImageResource(R.drawable.bad);

convertView.setTag(holder);

}else{

holder = (ViewHolder) convertView.getTag();

}

holder.praise.setText(bean.getPraise()+"");

holder.step.setText(bean.getStep()+"");

holder.title.setText(listItems.get(position).get("title")+"");

/*

每次会复用convertView,

convertView没有被赋值,就会使用之后赋值的数据,

比如:点击了第一行数据赞的按钮,相应的第一行点赞图片变为红色

当向下滑动页面时,下方的也会有一项数据发生变化,复用

在这里为每次重用赋值

*/

if(bean.getPraise()!=0){

holder.img_praise.setImageResource(R.drawable.good);

}else{

holder.img_praise.setImageResource(R.drawable.good_no);

}

if(bean.getStep()!=0){

holder.img_step.setImageResource(R.drawable.bad);

}else{

holder.img_step.setImageResource(R.drawable.bad_no);

}

holder.img_praise.setOnClickListener(new imgClick(position,bean));

return convertView;

}

class imgClick implements View.OnClickListener {

private int position;

private Bean bean;

public imgClick(int position,Bean bean){

this.position = position;

this.bean = bean;

}

@Override

public void onClick(final View v) {

Log.i("position",position+"");

if(bean.getPraise()==0){

if(isExist.get(position) == false){

final Handler handler = new Handler() {

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

switch (msg.what){

case 1:

ImageView btn = (ImageView) v;

if(v.getId() == btn.getId()) {

isExist.put(position, true);

bean.setPraise(bean.getPraise()+1);

btn.setImageResource(R.drawable.good);

AnimationTools.scale(btn);

notifyDataSetChanged();

break;

}

case 2:

Toast.makeText(context, "失败", Toast.LENGTH_LONG).show();

break;

}

}

};

new Thread(){

@Override

public void run() {

Message msg = new Message();

msg.what=1;

handler.sendMessage(msg);

}

}.start();

}

}else{

Toast.makeText(context, "已经点击过", Toast.LENGTH_LONG).show();

}

}

}

private static class ViewHolder{

public ImageView img_praise;

public ImageView getImg_praise() {

return img_praise;

}

public ImageView getImg_step() {

return img_step;

}

public TextView getPraise() {

return praise;

}

public TextView getStep() {

return step;

}

public TextView getTitle() {

return title;

}

private ImageView img_step;

public TextView praise;

private TextView step;

private TextView title;

}

class Bean{

public int getPraise() {

return praise;

}

public void setPraise(int praise) {

this.praise = praise;

}

public int getStep() {

return step;

}

public void setStep(int step) {

this.step = step;

}

private int praise;

private int step;

}

}

MainActivity

进行Listview值赋值,然后进行和Adapter的绑定

package com.gz.test_listview;

import android.app.Activity;

import android.content.Intent;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.AdapterView;

import android.widget.ListView;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.Objects;

public class MainActivity extends Activity {

private ListView listview;

private String[] title = {"商用","家用","测试","多联","空气能","商用","家用","测试","多联","空气能"};

private String[] praise = {"3","1","0","0","0","3","1","0","0","0"};

private String[] step = {"3","0","0","0","0","3","0","0","0","0"};

private ArrayList> map = new ArrayList>();

private ListView listView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

listview = (ListView) findViewById(R.id.listview);

for(int i=0;i

Map item = new HashMap();

item.put("title",title[i]);

item.put("praise",praise[i]);

item.put("step",step[i]);

map.add(item);

}

MainActivityAdapter adapter = new MainActivityAdapter(this,map);

listview.setAdapter(adapter);

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView> parent, View view, int position, long id) {

Intent intent = new Intent(MainActivity.this,DetailActivity.class);

startActivity(intent);

}

});

}

}

跳转界面,测试用

package com.gz.test_listview;

import android.app.Activity;

import android.os.Bundle;

import android.widget.ListView;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Map;

public class DetailActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.detail_info);

}

}

简单的动画效果的实现

直接用就好了

package com.gz.test_listview;

import android.view.View;

import android.view.animation.Animation;

import android.view.animation.ScaleAnimation;

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);

}

}

界面

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"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

android:paddingBottom="@dimen/activity_vertical_margin"

tools:context="com.gz.test_listview.MainActivity">

android:id="@+id/listview"

android:layout_width="match_parent"

android:layout_height="wrap_content">

Listview子项

android:id="@+id/lyt_root"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="#ccc"

android:orientation="vertical"

android:descendantFocusability= "blocksDescendants"

>

android:layout_width="fill_parent"

android:layout_height="wrap_content" >

android:id="@+id/has_exame"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="top|left"

/>

android:layout_margin="10dip"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_gravity="center_vertical"

android:background="@drawable/corners"

android:layout_weight="1.0"

android:orientation="vertical"

>

android:id="@+id/tv_name"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:textSize="14sp"

android:text="商用多联机"

android:textColor="#000"

/>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:orientation="horizontal" >

android:id="@+id/tv_date"

android:layout_marginTop="10dip"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:textSize="12sp"

android:text="时间 2016-10-10"

android:textColor="#000"

android:visibility="visible"

/>

android:id="@+id/tv_downloads"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center_vertical"

android:layout_weight="1"

android:textColor="#000"

android:textSize="14sp"

android:visibility="gone" />

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="horizontal"

android:gravity="center|right"

>

android:id="@+id/tv_praises_img"

android:layout_width="30dip"

android:layout_height="30dip"

android:background="@drawable/good_no"

android:layout_marginRight="5dip"

/>

android:id="@+id/tv_praises"

android:layout_width="50dip"

android:layout_height="wrap_content"

android:textColor="#000"

android:text="10"

android:textSize="14dip"

android:layout_gravity="center"

/>

android:id="@+id/tv_step_img"

android:layout_width="30dip"

android:layout_height="30dip"

android:background="@drawable/bad_no"

android:layout_marginRight="5dip"

/>

android:id="@+id/tv_step"

android:layout_width="50dip"

android:layout_height="wrap_content"

android:textColor="#000"

android:text="10"

android:textSize="14dip"

android:layout_gravity="center"

/>

点击item后进入的界面

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

android:paddingBottom="@dimen/activity_vertical_margin"

android:orientation="vertical"

>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="111"

/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="111"

/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="111"

/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="111"

/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="111"

/>

代码中是我对程序的理解,有的地方可能不是很明白,还得完善完善

这篇文章给了我很大帮助,动画效果就是搬过来的,哈哈,很不错,学习了

以上所述是小编给大家介绍的Android中Listview点赞功能的实现,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

android listview高级,Android中Listview点赞功能的实现相关推荐

  1. Android端IM应用中的@人功能实现:仿微博、QQ、微信,零入侵、高可扩展

    本文由"猫爸iYao"原创分享,感谢作者. 1.引言 最近有个需求:评论@人(没错,就是IM聊天或者微博APP里的@人功能),就像下图这样: ▲ 微信群聊界面里的@人功能  ▲ Q ...

  2. 【Android笔记67】Android之使用系统中的相机功能(拍照、保存照片、显示拍摄的照片、照片保存到图库等操作)

    这篇文章,主要介绍Android如何使用系统中的相机功能(拍照.保存照片.显示拍摄的照片.照片保存到图库等操作). 目录 一.使用Android相机功能 1.1.如何调用相机功能 1.2.调用相机功能

  3. android listview高级,Android 高级控件笔记-列表视图ListView 基本适配器BaseAdapter

    我最近做项目用到了基本适配器BaseAdapter,所以写篇博客总结一下,希望也能对你有所帮助 什么时候用BaseAdapter(同一项存在多个控件,复杂的列表时) Android中Adapter类其 ...

  4. android yuv加水印_在Android采集视频过程中增加水印功能实现

    CSDN旧文搬迁! 在Android采集视频过程中增加水印,并且水印包含一个变化的时间戳,这里考虑方案实现的时候,就想到了ffmpeg,ffmpeg包含很多filter能实现水印添加的功能. 基本实现 ...

  5. android 仿qq 通讯录,Android端IM应用中的@人功能实现:仿微博、QQ、微信,零入侵、高可扩展[图文+源码]...

    本文由"猫爸iYao"原创分享,感谢作者. 1.引言 最近有个需求:评论@人(没错,就是IM聊天或者微博APP里的@人功能),就像下图这样: WechatIMG43.jpg (19 ...

  6. android内存泄漏原因分析,Android Studio3.6的内存泄漏检测功能 VS LeakCanary

    2020年2月,谷歌发布了Android Studio 3.6版.它包括一个新的"内存泄漏检测"功能.这是否意味着我们不再需要流行的内存泄漏检测库"Leak Canary ...

  7. Android开发中ListView多屏的全选、反选功能

    [size=medium] 鄙人最近刚开始学习Android,在练习的时候写到一个ListView的全选反选功能.本来以为这个功能很简单,随随便便就能搞定,结果真的下手去做的时候被虐的死去活来,不知道 ...

  8. android 点赞局部刷新,局部刷新ListView,实现点赞功能

    今天看到一个需要实现一个点赞的功能.自己想没想明白,后来看了http://blog.csdn.net/nupt123456789/article/details/39432781 这篇博客,才有了思路 ...

  9. android微信模拟,Android中使用ListView模拟微信好友功能

    效果图: 分析: 1.创建listView 2.创建数据 3.创建适配器 将数据放到呈现数据的容器里面. 将这个容器(带数据)连接适配器. 其实是直接在我们自己写的adapter的getView重载方 ...

最新文章

  1. R语言绘制韦恩(venn)图
  2. mysql实现汉字转拼音
  3. gradle使用技巧之全局变量
  4. java常用class类_java常用类
  5. vxworks任务通信机制
  6. Word 如何设置空白页
  7. ASP.NET WEB API路由机制
  8. LeetCode每周刷题(2019.7.1-2019.7.7)
  9. 开始看看repast建模方面的东西
  10. D2 日报 2019年 03月 13日
  11. oracle ogg数据格式转换,Oracle 19C OGG基础运维-02数据初始化
  12. leetCode最短补全词
  13. Linux就这个范儿 第13章 打通任督二脉
  14. 人到中年城府真深的人,闭嘴不说这3句话,余生安稳,福报自来
  15. 野性兽王 访著名魔兽大师4K^Grubby
  16. BigBrother的大数据之旅Day 11 hive(2)
  17. 【26】删除有序数组中的重复选项
  18. 设计一个车辆违章系统
  19. 2017年3月10日 星期五 --出埃及记 Exodus 23:28
  20. 她是中国的计算机女神!中国首台自主设计计算机的缔造者——夏培肃(上)

热门文章

  1. 关于高低边驱动的续流二极管的理解
  2. 成为生意人的7种能力(摘于一个成功人士的述说)
  3. OFDM中FFT长度的影响
  4. A-模块 配置splunk
  5. 负数byte转为int
  6. Python安装笔记之注意事项
  7. Drf简介,什么是drf
  8. 公司建设网站的好处及优势
  9. 超分辨结构光技术学习
  10. 导学+初识MySQL+SQL语法规范+数据库相关操作+表相关操作+MySql存储引擎介绍+MySQL表的创建+测试数据类型