效果圖
思考
- 要實現以上效果,首先控件是:一個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中其他控件也可以獲取焦點