Android 下拉選擇

效果圖

這裏寫圖片描述

思考

  • 要實現以上效果,首先控件是:一個EditText,一個下拉的箭頭ImageView,一個listview,還有讓listview懸浮在文本框下方的PopupWindow
  • 當listview數據被刪除時,需要去判斷,如果listview的高度小於popupWindow的指定高度,則更新popupWindow的高度爲listview的高度,當沒有數據時,將下拉箭頭置爲不可見。

步驟

  • 佈局

    主頁面佈局

<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" >

    <EditText
        android:id="@+id/et"
        android:layout_width="250dip"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="30dp" />

    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@id/et"
        android:layout_alignRight="@+id/et"
        android:layout_marginRight="5dp"
        android:src="@drawable/down_arrow" />

</RelativeLayout>

listview的適配器的佈局文件:

<?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:descendantFocusability="blocksDescendants"
    android:orientation="horizontal"
    android:padding="15dip" >

    <TextView
        android:id="@+id/tv_user"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:drawableLeft="@drawable/user"
        android:drawablePadding="5dip"
        android:gravity="center_vertical"
        android:text="90000" />

    <ImageView
        android:id="@+id/iv_delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:src="@drawable/delete" />

</LinearLayout>
  • 代碼

public class MainActivity extends Activity {

    private EditText et;
    private ImageView iv;
    private List<String> list = new ArrayList<String>();
    private ListView lv;
    private PopupWindow window;
    int popupWindowHeigth = 600;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initViews();
        initListeners();
        initData();
    }

    private void initViews() {
        setContentView(R.layout.activity_main);
        et = (EditText) this.findViewById(R.id.et);
        iv = (ImageView) this.findViewById(R.id.iv);
    }

    private void initListeners() {
        iv.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                showPopUpWindow();
            }
        });
    }

    private void showPopUpWindow() {
        if(window == null)
            window = new PopupWindow(lv, et.getWidth(), popupWindowHeigth);
        window.setFocusable(true);//要讓其中的view獲取焦點,必須設置爲true
        window.setBackgroundDrawable(new BitmapDrawable());//還必須設置一個背景圖片
        window.setOutsideTouchable(true);//設置點擊外部消失
        window.showAsDropDown(et, 0, 0);
    }

    private void initData() {
        for (int i = 0; i < 10; i++) {
            list.add(90000+i+"");
        }
        initListView();
    }

    private void initListView() {
        lv = new ListView(this);
        lv.setBackgroundResource(R.drawable.listview_background);
        lv.setVerticalScrollBarEnabled(false);//隱藏listview滾動條
        lv.setAdapter(new MyAdapter());
        lv.setOnItemClickListener(new OnItemClickListener() {

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

    class MyAdapter extends BaseAdapter{

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

        @Override
        public Object getItem(int position) {
            return null;
        }

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

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            final View view = View.inflate(MainActivity.this, R.layout.adapter_view, null);
            TextView tvUser = (TextView) view.findViewById(R.id.tv_user);
            ImageView ivDel = (ImageView) view.findViewById(R.id.iv_delete);
            tvUser.setText(list.get(position));
            ivDel.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    System.out.println("position="+position);
                    list.remove(position);
                    notifyDataSetChanged();

                    int listviewHeight = view.getHeight()*list.size();
                    window.update(et.getWidth(), listviewHeight<popupWindowHeigth?listviewHeight:popupWindowHeigth );
                    if(list.size()==0){
                        window.dismiss();
                        iv.setVisibility(View.GONE);
                    }
                }
            });
            return view;
        }

    }
}

補充:
假如listview的item中有Button,ImageButton,CheckBox等會強制獲取焦點的view時
此時,listview的item無法獲取焦點,從而無法被點擊
解決方法:給item的根佈局增加以下屬性
android:descendantFocusability=”blocksDescendants”
設置之後,Button獲取焦點,item中其他控件也可以獲取焦點

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章