天天看點

Popupwindow實作自定義的下拉菜單

學習之路又一案例,效果圖如下

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"
    tools:context=".MainActivity" >

    <EditText
        android:id="@+id/input"
        android:layout_width="200dip"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="110dip"
        android:text="@string/hello_world" />

    
    <ImageView 
        android:id="@+id/down_arrow"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/down_arrow"
        android:layout_alignRight="@id/input"
        android:clickable="true"
        android:layout_marginTop="120dip"
        />
</RelativeLayout>
           

然後是listview的Item資源

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    tools:context=".MainActivity" >

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/user" />

    <TextView
        android:id="@+id/tv_list_item"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal"
        android:text="@string/hello_world" />

    <ImageView
        android:id="@+id/delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/delete" />

</LinearLayout>
           

下面是主要代碼:

public class MainActivity extends Activity {

	protected static final String TAG = "MainActivity";
	private EditText et_input;
	private ImageView iv_downarrow;
	private ListView listview;
	private PopupWindow popwin;
	private List<String> msgList;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		et_input = (EditText) findViewById(R.id.input);
		iv_downarrow = (ImageView) findViewById(R.id.down_arrow);
		msgList = new ArrayList<String>();
		//初始化菜單資訊
		for(int i=0;i<20;i++){
			msgList.add("1818899000"+i);
		}
		
		initView();
		
		iv_downarrow.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				//定義 popupWindow
				popwin = new PopupWindow(MainActivity.this);
				popwin.setWidth(et_input.getWidth());//設定寬度
				popwin.setHeight(200);//設定寬度
				popwin.setContentView(listview);//為popwin填充内容
				popwin.setOutsideTouchable(true);//設定點選popwin以外的區域,總的關閉popwin
				popwin.showAsDropDown(et_input, 0, 0);//設定popwin的位置,在et_input下xy偏移量為0
			}
		});
		
	}

	private void initView() {
		// TODO Auto-generated method stub
		listview = new ListView(this);
		listview.setBackgroundResource(R.drawable.listview_background);//設定listView 背景
		listview.setDivider(null);//設定條目之間的分隔線為null
		listview.setVerticalScrollBarEnabled(false);//設定listview垂直方向滾動條隐藏
		listview.setAdapter(new MyAdapter());
	}
	
	private class MyAdapter extends BaseAdapter{

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return msgList.size();
		}

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return null;
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return 0;
		}

		@Override
		public View getView(final int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			ViewHolder holder;
			if(convertView == null){
				convertView = View.inflate(MainActivity.this, R.layout.list_item, null);
				holder = new ViewHolder();
				
				holder.tv_msg = (TextView) convertView.findViewById(R.id.tv_list_item);
				holder.iv_del = (ImageView) convertView.findViewById(R.id.delete);
				convertView.setTag(holder);
			}else{
				holder = (ViewHolder) convertView.getTag();
			}
			
			holder.tv_msg.setText(msgList.get(position));
			holder.iv_del.setOnClickListener(new OnClickListener() {
				
				@Override
				public void onClick(View v) {
					// TODO Auto-generated method stub
					//删除對應條目
					msgList.remove(position);
					//更新adapter資料
					MyAdapter.this.notifyDataSetChanged();
				}
			});
			convertView.setOnClickListener(new OnClickListener() {
				
				@Override
				public void onClick(View v) {
					// TODO Auto-generated method stub
					//設定輸入框
					et_input.setText(msgList.get(position));
					popwin.dismiss();
				}
			});
			
			return convertView;
		}
		
		private class ViewHolder{
			private TextView tv_msg;
			private ImageView iv_del;
		}
		
	}

}