Android选取gridview并且标出选择的顺序

原创 2016年08月31日 14:10:02

我们都见过QQ发送照片的时候有一个选择照片的时候,会标识出选择的顺序。具体用语言来描述一下就是:

gridview中,有很多item,当我们点击item的时候,会在右上角标识出你已经选择该item,并且,标识出你选择该item的顺序。如果取消选择某一个,那么其他的选择顺序全部-1。

先上个图吧,让大家更加直观的理解,如下图,第一个选择的是我们标记1,第二个选择标记2,第三个则是3,如果我们再点击2,则是取消选择,取消选择2的话,那么3就-1,变成2。而原先的2则是取消掉了。这就是我们要实现的效果。


这个界面的实现效果,我们给大家简单的说一下吧。重点是说一下右上角的计顺序的实现。

首先,gridview。然后定义item。定义adapter。

item的布局中,说明一下右上角这个控件,我用的是checkbox,因为有个选中和没选中的效果展示。

checkbox的背景选择的drawable如下:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@mipmap/num_check" android:state_checked="true" />
    <item android:drawable="@mipmap/num_normal" android:state_checked="false" />
    <item android:drawable="@mipmap/num_normal" />

</selector>  
然后,重点实现就是在我们的adapter中。

实现逻辑先说一下:

定义一个list,来存我们选中的checkbox,也就是你选择点一下checkbox,那么我们在这个list中add一个,然后使用notifyDataSetChanged()。而如果取消选择,则从我们的list中remove掉,然后notify。然后add到list中就有顺序了,这个数字标号就利用添加的顺序,然后index的基础上加1,就是我们的角标值。

废话也就这了,Adapter方面的代码吧:

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import com.kegoal.model.Plan;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by Administrator on 2016/8/26 0026.
 */
public class GridPlanAdapter extends BaseAdapter {

    Context context;
    List<Plan> list;
    /**
     * 存已经选择checkboxlist
     */
    List<Plan> selectedPostions;

    public GridPlanAdapter(Context _context, List<Plan> _list) {
        this.list = _list;
        this.context = _context;
//        selectedPostions = new ArrayList<Plan>();
    }

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

    @Override
    public Plan getItem(int position) {
        return list.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Plan plan = getItem(position);
        ViewHolder holder = null;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = LayoutInflater.from(context).inflate(R.layout.make_plan_item, null);
            holder.num_plan = (CheckBox) convertView.findViewById(R.id.num_make_plan);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
//        final ViewHolder finalHolder = holder;
        int selectNumber = getSelectedIndex(plan);
        if (selectNumber != 0) {
            holder.num_plan.setText(String.valueOf(selectNumber));
        } else {
            holder.num_plan.setText("");
        }
        holder.num_plan.setTag(plan);
        holder.num_plan.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                Plan item = (Plan) buttonView.getTag();
                if (isChecked) {
                    selectPlan(item);
                    notifyDataSetChanged();
                } else {
                    unSelectPlan(item);
                    notifyDataSetChanged();
                }

            }
        });

        return convertView;
    }


    class ViewHolder {
        public CheckBox num_plan;
    }

    //选择checkbox的时候,将plan添加到list    void selectPlan(Plan p) {
        if (selectedPostions == null) {
            selectedPostions = new ArrayList<>();
        }
        if (!selectedPostions.contains(p))
            selectedPostions.add(p);
    }

    //取消选择,从listremove    void unSelectPlan(Plan p) {
        if (selectedPostions == null)
            return;
        if (selectedPostions.contains(p))
            selectedPostions.remove(p);
    }

    //获取右上角的角标,角标就是listindex+1
    int getSelectedIndex(Plan p) {
        if (selectedPostions == null || !selectedPostions.contains(p))
            return 0;
        else
            return (selectedPostions.indexOf(p) + 1);
    }
}
这就是实现的代码,关键地方我也都有注释啦,还有一处比较需要说明一下的地方,个人觉得比较重要,就是对于checkbox这个view的setTag。然后在CheckChangeListener中getTag,实际上,是确认我们选择取消的是哪一个checkbox,然后将其在list中移除或者add即可。

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

Android从相册选取图片并裁剪

一.概述1.选取照片并显示 启动相册的动作为public static final java.lang.String ACTION_GET_CONTENT = "android.intent.act...
  • Small_Lee
  • Small_Lee
  • 2016年02月01日 10:43
  • 3265

Android拍照或选择本地图片并剪裁图片设置成头像

现在很多的App中90%都有头像的设置,头像设置无非就是两种情况:1,从本地图片库中选取一张进行裁剪之后上传 2,使用手机拍照,将拍摄的照片进行裁剪然后上传。基于这两种情况我整理出一个demo,将这两...
  • lplj717
  • lplj717
  • 2016年06月06日 10:55
  • 1296

android gridview 出现重复选择 解决

今天做一个文件管理器的时候需要用到多选
  • flydream3618
  • flydream3618
  • 2014年08月23日 16:14
  • 1164

自定义Gridview实现拖拉改变顺序 仿新闻频道管理

源码:http://download.csdn.net/detail/lm_zp/9563945 activity_main.xml
  • LM_ZP
  • LM_ZP
  • 2016年06月30日 16:07
  • 730

Android的GridView中的选中图标后图标的背景颜色

1.首先在GridView组件中添加android:listSelector="@android:color/transparent",表示选中图标后颜色是透明的(给用户的感觉就是根本不晓得点没点图标...
  • xuxiaocheng1
  • xuxiaocheng1
  • 2014年02月28日 13:21
  • 1261

Android类似微信详细地址选择(高德地图)

利用高德地图的API做了一个类似微信发送位置界面地址选择,界面就3个,一个选择地址(周边搜索),一个搜索界面(关键字搜索),最后将选择的地址信息返回主界面,效果图如下:     对于详细地...
  • Ikulm
  • Ikulm
  • 2017年04月18日 16:52
  • 2042

Android调用本地相册选择图片并剪切后展示和缓存

直接来代码(注释足够清楚了): 选择图片.setOnClickListener(new OnClickListener{ gallery(); }); private...
  • u011732740
  • u011732740
  • 2016年09月22日 10:38
  • 546

GridView在Fragment中的使用

以下是实现的通过GridView加载广告图片(没有加载文字),上面的“今日推荐”,“更多”字样是通过Layout布局实现的。通过添加监听器,点击每一个图片,并且携带图片的Id进行转跳 这是一个G...
  • u012077264
  • u012077264
  • 2015年08月21日 12:49
  • 3563

【解决】GridView设置了 android:listSelector,选中某项背景色也会被选中

listSelector是listview的一个属性用来控制某一项被选中时的颜色,在4.0以后的系统中这个listSelector表现正常,在2.3和2.2(可能还有其他版本)中这个属性会变成点击某项...
  • ab6326795
  • ab6326795
  • 2013年12月19日 16:40
  • 1669

浅谈GridView中的行选择功能

 这两天为了个GridView的行选择功能,查了很多资料,今天终于把问题解决了。总结一下,同时给遇到同样问题的人一点参考。     首先说一下要解决的问题:     1、在Gridview中,点击行中...
  • yel_hb
  • yel_hb
  • 2009年08月07日 13:25
  • 6680
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android选取gridview并且标出选择的顺序
举报原因:
原因补充:

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