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

我们都见过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即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章