Android下拉选择框之PopupWindow

1.效果图

Android下拉选择框之PopupWindow

 

2.思路分析

1.点击弹出对话框 popupwindow

2.对popupwindow进行相关设置,popupwindow中设置view为listview

3.listview中item设置点击事件

4.显示popupwindow

3.代码

1.布局文件

1.activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_marginLeft="20dp"
        >
        <EditText
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:id="@+id/tv"

            />
        <ImageButton
            android:id="@+id/imgshowdown"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/down_arrow"
            android:padding="4dp"
            android:layout_alignTop="@+id/tv"
            android:background="@null"
            android:layout_alignParentRight="true"
            />

    </RelativeLayout>


</RelativeLayout>

 

2.item_num_list

<?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:gravity="center_vertical"
    android:padding="3dp"
    >
    <ImageView
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:src="@drawable/ic_default_person"
        android:layout_marginRight="10dp"
        />
    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:id="@+id/tv"
        android:layout_weight="1"
        />
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/img"
        android:src="@drawable/delete"
        android:padding="5dp"
        />



</LinearLayout>

 

2.MainActivity

public class MainActivity extends AppCompatActivity implements View.OnClickListener, AdapterView.OnItemClickListener {
    @BindView(R.id.tv)
    EditText tv;
    @BindView(R.id.imgshowdown)
    ImageButton imgshowdown;

    private ListView listView;
    private List<String> datas;
    private MyAdapter adapter;

    private PopupWindow popupWindow;

    //    private TextView tv;
//    private
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        imgshowdown.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        initListView();//初始化listview
        showpopup();//初始化popupwindow 并显示出来
    }

    private void showpopup() {
        if(popupWindow==null){
            popupWindow=new PopupWindow(listView, tv.getWidth(), 300);
            popupWindow.setOutsideTouchable(true);//点击外部消失

            //设置背景  不然 setOutsideTouchable(true) 不起作用
            popupWindow.setBackgroundDrawable(new BitmapDrawable());
            popupWindow.setFocusable(true); //设置可获取焦点
        }
        popupWindow.showAsDropDown(tv,0,0);//显示位置
    }

    private void initListView() {
        if(datas==null){
            datas=new ArrayList<>();
            for (int i = 0; i <30 ; i++) {
                datas.add("person"+i);
            }
        }
        if (listView == null) {
            listView = new ListView(this);
            listView.setDividerHeight(0);
            listView.setBackgroundResource(R.drawable.listview_background);
            listView.setOnItemClickListener(this);
            adapter=new MyAdapter();
            listView.setAdapter(adapter);
        }
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        tv.setText(datas.get(position));
        popupWindow.dismiss();
    }

    //listview 适配器
    class MyAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            return datas.size();
        }

        @Override
        public Object getItem(int position) {
            return datas.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {
                convertView = View.inflate(parent.getContext(), R.layout.item_num_list, null);
                holder=new ViewHolder(convertView);
//                holder.tv.setText();
                convertView.setTag(holder);

            }else{
                holder= (ViewHolder) convertView.getTag();
            }
            holder.tv.setText(datas.get(position));
            holder.img.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    datas.remove(position);
                    notifyDataSetChanged();
                    if(datas.size()==0){
                        popupWindow.dismiss();
                    }
                }
            });
            return convertView;
        }


    }
    static class ViewHolder {
        @BindView(R.id.tv)
        TextView tv;
        @BindView(R.id.img)
        ImageView img;

        ViewHolder(View view) {
            ButterKnife.bind(this, view);
        }
    }
}