要实现的效果图
下拉列表使用的是 动态ListView + popupWindow实现
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#11000000" > <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" > <EditText android:id="@+id/editText" android:layout_width="200dp" android:layout_height="40dp" /> <ImageView android:id="@+id/iv_select" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignRight="@id/editText" android:layout_centerVertical="true" android:background="@drawable/down_arrow" /> </RelativeLayout> </RelativeLayout>
<?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="wrap_content" android:gravity="center_vertical" android:orientation="horizontal" android:padding="5dp" > <TextView android:id="@+id/tv_content" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:drawableLeft="@drawable/user" android:drawablePadding="3dp" /> <ImageView android:id="@+id/iv_delete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/delete" /> </LinearLayout>
1、初始化View
2、初始化下来按钮的监听器和事件操作框架
3、动态创建ListView
a、动态创建数据
b、动态创建ListView
c、创建Adapter并绑定数据
4、创建PopupWindow,将ListView添加到PopupWindow中,并在下来按钮的事件操作中调用
5、设置item的删除图片的事件
6、设置item选中的事件
注意:假如listview的item中有Button,ImageButton,CheckBox等会强制获取焦点的view
此时,listview的item无法获取焦点,从而无法被点击
解决方法1:给item的根布局增加以下属性
android:descendantFocusability="blocksDescendants"
设置之后,Button获取焦点,item中其他控件也可以获取焦点
解决办法2:使用ImageView进行代替
public class MainActivity extends Activity implements OnClickListener { private EditText editText; private ImageView iv_select; private ArrayList<String> list = new ArrayList<String>(); private ListView lv; private PopupWindow popupWindow; private int popupWindowHeight = 300; // 像素 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initView(); initData(); initListener(); } /** * 初始化View */ private void initView() { setContentView(R.layout.activity_main); editText = (EditText) findViewById(R.id.editText); iv_select = (ImageView) findViewById(R.id.iv_select); } /** * 初始化监听事件 */ private void initListener() { iv_select.setOnClickListener(this); } /** * 初始化数据 */ private void initData() { for (int i = 0; i < 20; i++) { list.add("aaabbbccc" + i); } initListView(); } /** * 动态创建 */ private void initListView() { lv = new ListView(this); // 设置背景 lv.setBackgroundResource(R.drawable.listview_background); // 让垂直滚动条不可见 lv.setVerticalScrollBarEnabled(false); lv.setAdapter(new MyAdapter()); lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { editText.setText(list.get(position)); popupWindow.dismiss(); } }); } class MyAdapter extends BaseAdapter { @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { final View view = View.inflate(MainActivity.this, R.layout.list_item, null); TextView tv = (TextView) view.findViewById(R.id.tv_content); ImageView iv = (ImageView) view.findViewById(R.id.iv_delete); // 设置文本 tv.setText(list.get(position)); // 图片点击事件 iv.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 删除集合中的数据 list.remove(position); // 更新adapter notifyDataSetChanged(); // 数据减少后,高度要更新减少 int listViewHeight = view.getHeight() * list.size(); popupWindow.update( editText.getWidth(), listViewHeight > popupWindowHeight ? popupWindowHeight : listViewHeight); // 没有数据的时候popupWindow要消失 选择三角也要消失 if (list.size() == 0) { popupWindow.dismiss(); iv_select.setVisibility(View.GONE); } } }); return view; } } /** * 当点击右边图片的时候 显示list */ private void showList() { // 只有为空的时候才去创建 if (popupWindow == null) { popupWindow = new PopupWindow(lv, editText.getWidth(), popupWindowHeight); } // popupWindow默认是不能获取焦点的 // 1、设置popupWindow获取焦点 popupWindow.setFocusable(true); // 2、需要设置背景图片 popupWindow才可以获取焦点 popupWindow.setBackgroundDrawable(new BitmapDrawable()); // 3、设置点击外部消失 popupWindow.setOutsideTouchable(true); popupWindow.showAsDropDown(editText, 0, 2); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.iv_select: showList(); break; } } }