本文仅供菜鸟交流观看,大神请绕路。
这里首先要明确一下需求,并不单单是为了用一个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; } }
由于代码比较简单,里面就没有什么备注了,一看就懂了。