安卓自定义列表dialog
前言
很早之前写过一篇
自定义提示信息Dialog
这个形式也是最常用的,不过最近需要用到列表信息
Dialog
,原生的不光样式不能满足需求,而且是开发电视端的APP,需要对焦点进行特殊处理,所以就需要自定义
Dialog
我们先来看一下系统自带的列表Dialog。
系统自带列表Dialog
第一种:纯列表
我们先来看第一种:
最简单的一种,没有当前状态,只有列表,选中之后弹框就会消失(非手动调用
dialog.dismiss()
)
代码如下:
AlertDialog alertDialog = new AlertDialog
.Builder(MainActivity.this)
.setItems(new String[]{"科目一", "科目二", "科目三"}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,"选择了第"+which+"个",Toast.LENGTH_SHORT).show();
}).create();
alertDialog.show();
第二种:单选列表
这种列表会有checked提示,
setSingleChoiceItems()
中第二个参数就是控制第几个被选中,而且点击之后不会自动消失,需要手动调用
dialog.dismiss()
,有时会配合
setNegativeButton()、setPositiveButton
等一起使用。
代码如下:
AlertDialog alertDialog = new AlertDialog
.Builder(MainActivity.this)
.setSingleChoiceItems(new String[]{"科目一", "科目二", "科目三"}, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,"选择了第"+which+"个",Toast.LENGTH_SHORT).show();
}).create();
alertDialog.show();
第三种:多选列表
这种列表也会有checked提示,而且是多选框,
setSingleChoiceItems()
的第二个参数是boolean数组,控制哪些被选中。而且点击之后也不会自动消失,需要手动调用
dialog.dismiss()
,有时会配合
setNegativeButton()、setPositiveButton()
等一起使用。
代码如下:
AlertDialog alertDialog = new AlertDialog
.Builder(MainActivity.this)
.setMultiChoiceItems(new String[]{"科目一", "科目二", "科目三"}, new boolean[]{true, false, true}, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
Toast.makeText(MainActivity.this,"选择了第"+which+"个",Toast.LENGTH_SHORT).show();
}).create();
alertDialog.show();
自定义Dialog
看了系统自带的效果你会发现不能满足UI的效果,那么接下来进行我们的自定义。
第一步:自定义item的布局文件
item布局文件
dialog_item.xml
代码
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/contentConstraintLayout"
android:layout_width="@dimen/dp_450"
android:layout_height="@dimen/dp_85">
<TextView
android:id="@+id/typeTextview"
android:textSize="@dimen/sp_30"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:text="256Kbps"
android:textColor="@color/color_212121"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/stateImageView"
android:layout_width="@dimen/dp_65"
android:layout_height="@dimen/dp_65"
android:layout_marginEnd="17dp"
android:background="@drawable/diglog_sel"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
图片选中效果
diglog_sel.xml
代码
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/selected" android:state_selected="true" />
<item android:drawable="@android:color/transparent" />
</selector>
第二步:自定义adapter
我这里只是传递一些简单的数据到adapter,具体看实际业务传递不同的数据,控制不同的效果。
public class DialogItemAdapter extends BaseAdapter {
//这里可以传递个对象,用来控制不同的item的效果
//比如每个item的背景资源,选中样式等
public List<String> list;
LayoutInflater inflater;
public DialogItemAdapter(Context context, List<String> list) {
this.list = list;
inflater = LayoutInflater.from(context);
@Override
public int getCount() {
return list.size();
@Override
public String getItem(int i) {
if (i == getCount() || list == null) {
return null;
return list.get(i);
@Override
public long getItemId(int i) {
return i;
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.dialog_item, null);
holder.typeTextview = (TextView) convertView.findViewById(R.id.typeTextview);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
holder.typeTextview.setText(getItem(position));
return convertView;
public static class ViewHolder {
public TextView typeTextview;
}
第三步:使用
DialogItemAdapter adapter = new DialogItemAdapter(MainActivity.this, iniDatas());
AlertDialog alertDialog = new AlertDialog
.Builder(MainActivity.this)
.setSingleChoiceItems(adapter, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}).create();
alertDialog.show();
public List<String> iniDatas() {
List<String> list = new ArrayList<String>();