我们都见过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; /** * 存已经选择checkbox的list */ 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); } //取消选择,从list中remove掉 void unSelectPlan(Plan p) { if (selectedPostions == null) return; if (selectedPostions.contains(p)) selectedPostions.remove(p); } //获取右上角的角标,角标就是list中index+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即可。