\
如图:点击某一个按钮在下方显示一个dialog,外形可以自定义,item可以自定义,点击效果可以自定义;
自定义的dialog:
public class MoreTopicDialog extends Dialog {
public MoreTopicDialog(Activity context) {
super(context);
}
public MoreTopicDialog(Activity context, int themeResId) {
super(context, themeResId);
}
public static class Builder {
private Activity context;
private List<MoreTopicModel> classModels;
protected ListView mListView;
private AdapterView.OnItemClickListener onItemClickListener;
private CommonAdapter<MoreTopicModel> adapter;
private float scale;
private int screenWidth;
public Builder(Activity context) {
this.context = context;
scale = context.getResources().getDisplayMetrics().density;
screenWidth = ScreenTools.getWidth(context);
}
public Builder setItems(List<MoreTopicModel> classModels) {
this.classModels = classModels;
adapter = new CommonAdapter<MoreTopicModel>(context, R.layout.item_more_topic, classModels) {
@Override
public void convert(ViewHolder holder, MoreTopicModel classModel) {
holder.setImageResource(R.id.iv_icon, classModel.getItemIcon());
holder.setText(R.id.tv_title, classModel.getItem());
}
};
return this;
}
public Builder setOnItemClickListener(AdapterView.OnItemClickListener listener) {
this.onItemClickListener = listener;
return this;
}
public MoreTopicDialog create() {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final MoreTopicDialog dialog = new MoreTopicDialog(context, R.style.more_dialog_dialog);
dialog.setCanceledOnTouchOutside(true);
dialog.setCancelable(true);
View layout = inflater.inflate(R.layout.layout_more_topic, null);
dialog.addContentView(layout, new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
if (classModels.size() != 0) {
mListView = (ListView) layout.findViewById(R.id.lv_more_topic);
mListView.setAdapter(adapter);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
onItemClickListener.onItemClick(parent, view, position, id);
dialog.dismiss();
}
});
}
dialog.setContentView(layout);
Window dialogWindow = dialog.getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
dialogWindow.setGravity(Gravity.RIGHT | Gravity.TOP);
int i = (int) (50 * scale + 0.5f);
lp.x = 18; // 新位置X坐标
lp.y = i; // 新位置Y坐标
lp.width = screenWidth*2 / 3; // 宽度
dialogWindow.setAttributes(lp);
return dialog;
}
}
}
数据模型:
public class MoreTopicModel {
private String itemid;
private int itemIcon;
private String item;
}
自定义的一个adapter
public abstract class CommonAdapter<T> extends BaseAdapter
{
protected Context mContext;
protected List<T> mDatas;
protected LayoutInflater mInflater;
private int layoutId;
public CommonAdapter(Context context,int layoutId, List<T> datas )
{
this.mContext = context;
mInflater = LayoutInflater.from(context);
this.mDatas = datas;
this.layoutId = layoutId;
}
@Override
public int getCount()
{
return mDatas.size();
}
@Override
public T getItem(int position)
{
return mDatas.get(position);
}
@Override
public long getItemId(int position)
{
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder = ViewHolder.get(mContext, convertView, parent,
layoutId, position);
convert(holder, getItem(position));
return holder.getConvertView();
}
public abstract void convert(ViewHolder holder, T t);
}
使用方法
<style name="more_dialog_dialog" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoTitle">true</item>
<!--边框-->
<item name="android:background">@drawable/frame_more_topic</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:backgroundDimAmount">0.6</item>
</style>
使用实例
new MoreTopicDialog
.Builder(ViewPointActivity.this)
.setItems(viewModel.getMoreTopicList())
.setOnItemClickListener(
new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
}}).create().show();