Android自定义下拉列表——PopupWindow+ListView(单选模式)

最近在项目中使用android原生的Spinner发现其显示效果没有想象中的好,于是就动手写了一个popuwindow的弹出框下拉列表,在popuwindow中主要使用了ListView自带的单选和多选模式。

listview中使用自带的选择框有两种方式,第一种方式:

ListView lv = (ListView) findViewById(R.id.list_view);
lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

第二中方式:就是在listview布局中直接加,建议使用第二种

android:choiceMode="singleChoice"

先书写一个带listview的布局,popuwindow_spinner布局:



 

    
    
    
    
    

其实在popuwindow中使用listview和在Activity中使用相同,具体实现代码如下(具体使用看注释):

  public class SpinnerPopuwindow extends PopupWindow{
  
    private View conentView;
    private ListView listView;
    private SpinnerPopAdapter adapter;
    private Activity context;
    private TextView pop_title;
    private TextView pop_cancel;
  /**
     * @param context 上下文
     * @param string 获取到未打开列表时显示的值
     * @param list 需要显示的列表的集合
     * @param itemsOnClick listview在activity中的点击监听事件
     */
    @SuppressLint("InflateParams")
    public SpinnerPopuwindow(final Activity context, final String string, final List list, AdapterView.OnItemClickListener itemsOnClick) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.context =context;
        conentView = inflater.inflate(R.layout.popuwindow_spinner, null);
        // 设置SelectPicPopupWindow的View
        this.setContentView(conentView);
        // 设置SelectPicPopupWindow弹出窗体的宽
       this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
    //    this.setWidth(view.getWidth());
        // 设置SelectPicPopupWindow弹出窗体的高
        this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
        // 设置SelectPicPopupWindow弹出窗体可点击
        this.setFocusable(true);
        // 刷新状态
        this.update();
        this.setOutsideTouchable(false);
        // 实例化一个ColorDrawable颜色为半透明
        ColorDrawable dw = new ColorDrawable(0000000000);
        // 点back键和其他地方使其消失,设置了这个才能触发OnDismisslistener ,设置其他控件变化等操作
        this.setBackgroundDrawable(dw);
        this.setOnDismissListener(new OnDismissListener() {
            @Override
            public void onDismiss() {
                darkenBackground(1f);
            }
        });
        //解决软键盘挡住弹窗问题
        this.setSoftInputMode(PopupWindow.INPUT_METHOD_NEEDED);
        this.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

        // 设置SelectPicPopupWindow弹出窗体动画效果
      //  this.setAnimationStyle(R.style.AnimationPreview);

        adapter = new SpinnerPopAdapter(context,list);
        listView = (ListView) conentView.findViewById(R.id.listView);
        listView.setOnItemClickListener(itemsOnClick);
        listView.setAdapter(adapter);
        // setAdapter是异步进行的,为了使弹窗能即时刷新,所以使用post+Runnable
        listView.post(new Runnable() {
            @Override
            public void run() {
           //主要是为了比对未打开列表时显示的值和列表中的值进行默认选中
                for(int j = 0;j

SpinnerPopAdapter书写方式是最基本的适配器写法:

public class SpinnerPopAdapter extends BaseAdapter {
    private List content;
    private Context context;
    private LayoutInflater mInflater;

    public SpinnerPopAdapter(Context context,List content){
        this.context = context;
        this.content = content;
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return content == null ? 0 : content.size();
    }

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if(convertView == null){
            convertView = mInflater.inflate(R.layout.popuwindow_spinner_item,null);
            viewHolder = new ViewHolder();
            viewHolder.tv_spinner = (TextView) convertView.findViewById(R.id.tv_spinner);
            viewHolder.check = (CheckableLayout) convertView.findViewById(R.id.check);
            convertView.setTag(viewHolder);
        }else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        String spinnerText = content.get(position);
        viewHolder.tv_spinner.setText(spinnerText);
        return convertView;
    }
    public static class ViewHolder{
        TextView tv_spinner;
        public CheckableLayout check;
    }
}

adapter中布局,其中要记得自定义选中布局CheckableLayout继承自RelativeLayout并实现Checkable,网上例子很多我就不在这儿写了,popuwindow_spinner_item布局:




    
    


最主要的是在Activity中的使用

public class NewTaskActivity extends Activity implements View.OnClickListener{

    public static final String TAG = "NewTaskActivity";

    private ImageView goback;
    private LinearLayout task_type;
    private TextView tv_type;
    private SpinnerPopuwindow mSpinnerPopuwindow;

    /** 模拟的假数据 */
    private List testData;
    private String type;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_newtask);
        initView();
    }

    public void initView(){
        goback = (ImageView) findViewById(R.id.goback);
        goback.setOnClickListener(this);
        task_type = (LinearLayout) findViewById(R.id.task_type);
        task_type.setOnClickListener(this);
        tv_type = (TextView) findViewById(R.id.tv_type);
        TestData();
    }
    /**
     * 模拟假数据
     */
    private void TestData() {
        testData = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            String str = new String("数据" + i);
            testData.add(str);
        }
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.goback:
                this.finish();
                break;
            case R.id.task_type:
                type = tv_type.getText().toString();
                mSpinnerPopuwindow = new SpinnerPopuwindow(this,type,testData,itemsOnClick);
                mSpinnerPopuwindow.showPopupWindow(task_type);
                mSpinnerPopuwindow.setTitleText("类型");//给下拉列表设置标题
                break;
        }
    }
    //SchedulePopuwindow为弹出窗口实现监听类
    private AdapterView.OnItemClickListener itemsOnClick = new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView parent, View view, int position, long id) {
            String value = testData.get(mSpinnerPopuwindow.getText());
            tv_type.setText(value);
            mSpinnerPopuwindow.dismissPopupWindow();
        }
    };
}

Activity中的布局,activity_newtask布局:



    
        

        
    

    
        
        
        
        
            
    
 

你可能感兴趣的:(Android自定义下拉列表——PopupWindow+ListView(单选模式))