1、查看源码,会发现PopupMenu和Spinner内部都是使用ListPopupWindow实现下拉列表效果,所以ListPopupWindow是基础。
2、PopMenu的列表页面无法定制UI,只能显示光秃秃的文字;而ListPopupWindow和Spinner可以通过适配器来设置每项的布局风格,当然ListPopupWindow是最灵活的,不但可在左侧显示列表,还能在右侧显示列表。
3、PopMenu可通过子菜单实现多级菜单效果,而ListPopupWindow和Spinner只有一级列表。
4、ListPopupWindow和Spinner可以设置默认选中项,而PopMenu没有默认选中项。
5、Spinner既可以下拉列表来展示,也可以对话框来展示;而PopupMenu和ListPopupWindow只能以下拉列表展示。
从上面可以看出ListPopupWindow的自主性更强一点,所以作者记录一下ListPopupWindow的基本使用:
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.ListPopupWindow;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener,AdapterView.OnItemClickListener{
private EditText et_input;
private Button button;
private ListPopupWindow listPopup;
private ListPopupAdapter adapter;
private List list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list=new ArrayList<>();
for(int i=0;i<10;i++){
list.add(i+"");
}
initView();
}
private void initView() {
et_input= (EditText) findViewById(R.id.et_input);
button= (Button) findViewById(R.id.button);
et_input.setOnClickListener(this);
button.setOnClickListener(this);
listPopup=new ListPopupWindow(this);
adapter=new ListPopupAdapter(this,list);
listPopup.setAdapter(adapter);
listPopup.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
listPopup.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
listPopup.setModal(true);
listPopup.setOnItemClickListener(this);
}
// setModal : 设置显示模式。通常设置为true。
// setWidth : 设置下拉列表窗口的宽度。
// setHeight : 设置下拉列表窗口的高度。
// setAnchorView : 设置下拉列表的参照控件。下拉列表在显示时将展现在参照控件的下方,注意:如果不设置参照控件就直接调用show函数,系统不知道要把下拉列表在何处展示,只能是异常退出了。
// setDropDownGravity : 设置下拉列表的对齐方式。Gravity.START表示与参照控件左侧对齐,Gravity.END表示与参照控件右侧对齐。注意:该函数只在4.4.2及以上版本中使用。
// setOnItemClickListener : 设置列表项的点击监听器。
// show : 显示下拉列表窗口。
// dismiss : 关闭下拉列表窗口。
// setOnDismissListener : 设置下拉列表的关闭监听器。
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.et_input:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
listPopup.setDropDownGravity(Gravity.END);
}
listPopup.setAnchorView(v);
listPopup.show();
break;
case R.id.button:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
listPopup.setDropDownGravity(Gravity.START);
}
listPopup.setAnchorView(v);
listPopup.show();
break;
}
}
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
Toast.makeText(this, position+"", Toast.LENGTH_SHORT).show();
if(listPopup!=null){
listPopup.dismiss();
}
}
}
效果图如下:
奉上csdn下载地址:http://download.csdn.net/detail/android_zhengyongbo/9842450