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