弹出单选GridView.png
//add_pay就是底部那个按钮
add_pay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog alertDialog = new AlertDialog.Builder(AddActivity.this)
.setView(getChoiceView(2))
.create();
alertDialog.show();
}
});
上面的重点是那个getChoiceView(2)
,因为我有好几个数据源,所以就用一个int类型参数的type来区分一下,不同的type取不同的数据源展示。
private View getChoiceView(final int type) {
//R.layout.dialog_choice就是GridView所在的那个布局,下面有介绍
View view = LayoutInflater.from(AddActivity.this).inflate(R.layout.dialog_choice, null);
GridView gv = (GridView) view.findViewById(R.id.gv);
//GridView的数据源,直接从strings.xml中加载过来
List<String> data;
//自定义适配器
final MyAdapter adapter;
//判断类型,加载数据源设置Adapter
if (type == 1) {
data = Arrays.asList(getResources().getStringArray(R.array.event));
adapter = new MyAdapter(this, data);
gv.setAdapter(adapter);
//设置默认选中
adapter.changeState(eventSelected);
} else {
data = Arrays.asList(getResources().getStringArray(R.array.pay));
adapter = new MyAdapter(this, data);
gv.setAdapter(adapter);
adapter.changeState(paySelected);
}
//监听点击事件,点击以后,之前的选中应该变为未选中
gv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (type == 1) {
eventSelected = position;
//将选择的内容设置到底部的按钮上去
add_event.setText(eventArray.get(position).toString());
} else {
paySelected = position;
add_pay.setText(payArray.get(position).toString());
}
alertDialog.dismiss();
adapter.changeState(position);
}
});
return view;
}
GridView所在的布局如下:
<?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="match_parent"
android:background="@color/white"
android:gravity="center"
android:orientation="vertical">
<GridView
android:id="@+id/gv_choice"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:horizontalSpacing="15dp"
android:listSelector="@color/transparent"
android:numColumns="2" //2列
android:verticalSpacing="15dp"></GridView>
</LinearLayout>
GridView中每个item的布局如下:
<?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="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv_choice"
android:layout_width="match_parent"
android:layout_height="40dp"
android:button="@null"
android:gravity="center"
android:paddingBottom="10dp"
android:paddingTop="10dp"
android:textColor="@color/white" />
</LinearLayout>
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = mInflater.inflate(R.layout.choice_item, null);
viewHolder.title = (TextView) convertView.findViewById(R.id.tv_choice);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
if (!"".equals(data.get(position))) {
viewHolder.title.setText(data.get(position));
}
if (list.get(position) == true) {
viewHolder.title.setBackgroundDrawable(activity.getResources()
.getDrawable(R.drawable.choice_item_bg_selected));
} else {
viewHolder.title.setBackgroundDrawable(activity.getResources()
.getDrawable(R.drawable.choice_item_bg_default));
}
return convertView;
}
/**
* 修改选中时的状态
*
* @param position
*/
public void changeState(int position) {
if (lastPosition != -1) {
list.set(lastPosition, false);// 取消上一次的选中状态
}
list.set(position, !list.get(position));// 设置这一次的选中状态
lastPosition = position; // 记录本次选中的位置
notifyDataSetChanged(); // 通知适配器进行更新
}
演示.gif