用PopupWindow实现下拉列表,并再次熟悉一些其他基础知识点。

本文仅供菜鸟交流观看,大神请绕路。


这里首先要明确一下需求,并不单单是为了用一个PopupWindow来实现一个下拉列表

需求1:PopupWindow实现下来列表

需求2:点击选中列表中item中时,item中显示字体,再次点击字体隐藏。

需求3:所有选中的item,不论是什么顺序选择的,最后都按position(用的listview)的大小,从小到大排列然后显示在textview里。


其实需求写明白后,就知道如何去实现这些功能了。 话不多说 贴出代码.



public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView textView;
    private ListView listView;
    private PopupWindow popupWindow;
    private MyAdapter myAdapter;
    private List<BeanVo> data;
    //    private List<String> textList = new ArrayList<String>();
    private Map<Integer, String> map = new HashMap<Integer, String>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initUI();
    }

    private void initUI() {
        textView = (TextView) findViewById(R.id.tv);
        textView.setOnClickListener(this);
    }

    private void initSeletPopup() {
        listView = new ListView(this);
        testData();

        myAdapter = new MyAdapter(this, data);
        listView.setAdapter(myAdapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                BeanVo beanVo = data.get(position);
                if (beanVo.isShow()) {
                    map.remove(position);
                    beanVo.setShow(false);
                } else {
                    map.put(position, data.get(position).getName());
                    beanVo.setShow(true);
                }
                myAdapter.notifyDataSetChanged();
            }
        });
        popupWindow = new PopupWindow(listView, textView.getWidth(), ActionBar.LayoutParams.WRAP_CONTENT, true);
        Drawable drawable = ContextCompat.getDrawable(this, R.drawable.bg_corner);
        popupWindow.setBackgroundDrawable(drawable);
        popupWindow.setFocusable(true);
        popupWindow.setOutsideTouchable(true);
        popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
            @Override
            public void onDismiss() {
                if (map.size() > 0) {
                    String tmp = "";
                    int[] ints = sortPosition();
                    for (int i = 0; i < map.size(); i++) {
                        tmp = tmp + map.get(ints[i]);
                    }
                    textView.setText(tmp);
                }

                popupWindow.dismiss();
            }
        });
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.tv:
                map.clear();
                initSeletPopup();
                if (popupWindow != null && !popupWindow.isShowing()) {
                    popupWindow.showAsDropDown(textView, 0, 10);
                }
                break;
        }
    }

    private void testData() {
        data = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            BeanVo beanVo = new BeanVo();
            beanVo.setName("数据" + i);
            beanVo.setShow(false);
            data.add(beanVo);
        }
    }

    private int[] sortPosition() {
        Set<Integer> str = map.keySet();
        Object[] tt = str.toArray();
        int N = map.size();
        int[] arr = new int[N];
        int a = 0;
        for (Object oo : tt) {
            if (oo instanceof Integer) {
                arr[a] = (Integer) oo;
            }
            a++;
        }
       for (int i = arr.length - 1; i > 0; i--) {
            for (int j = 1; j <= i; j++) {
                if (arr[j - 1] > arr[j]) {
                    int tmp = arr[j - 1];
                    arr[j - 1] = arr[j];
                    arr[j] = tmp;
                }
            }
        }
        return arr;
    }
}



public class MyAdapter extends BaseAdapter {
    private List<BeanVo> mData;
    private LayoutInflater layoutInflater;
    private Context mContext;
    HashMap<Integer, View> hashMap = new HashMap<Integer, View>();


    public MyAdapter(Context context, List data) {
        this.mContext = context;
        this.mData = data;
        this.layoutInflater = LayoutInflater.from(context);
    }

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

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {
        ViewHolder viewHolder = null;
//        if (hashMap.get(position)==null) {//如果变化的对象没有绑定position,该方法可以防止复用
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = layoutInflater.inflate(R.layout.popup_text_item, null);
            viewHolder.tv_data = convertView.findViewById(R.id.tv_data);
            viewHolder.select_tv = convertView.findViewById(R.id.select_tv);
            convertView.setTag(viewHolder);
//            hashMap.put(position,convertView);
        } else {
//            convertView=hashMap.get(position);
            viewHolder = (ViewHolder) convertView.getTag();

        }
        viewHolder.tv_data.setText(mData.get(position).getName());
        if (mData.get(position).isShow()) {
            viewHolder.select_tv.setVisibility(View.VISIBLE);
        } else {
            viewHolder.select_tv.setVisibility(View.GONE);
        }
        return convertView;
    }


    public class ViewHolder {
        public TextView tv_data;
        public TextView select_tv;
    }
}

public class BeanVo {

    public String name;
    public boolean show;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isShow() {
        return show;
    }

    public void setShow(boolean show) {
        this.show = show;
    }
}


由于代码比较简单,里面就没有什么备注了,一看就懂了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值