一个标签选择控件,类似于评价标签,已经实现点击事件选中效果,由于业务需要,我做的是使用ListView展示多个标签控件,并且listview的每个item中只能被选中一项,效果如下图
下面上代码
public class ScreenActivity extends BaseActivity implements View.OnClickListener{ ListView lv_container; List<RespScreen> list; WhoAroudApplication application; Gson gson; Button btn_affirm; int checkFragment; @Override public void setupViewLayout() { setContentView(R.layout.activity_screen); application= (WhoAroudApplication) getApplication(); gson=application.gson; } @Override public void initView() { lv_container= (ListView) findViewById(R.id.lv_container); btn_affirm= (Button) findViewById(R.id.btn_affirm); } @Override public void listener() { btn_affirm.setOnClickListener(this); } @Override public void logicDispose() { try { JSONObject aa=new JSONObject("{\"data\":[{\"title\":\"性别\",\"parameter\":\"sex\",\"content\":[{\"name\":\"不限\",\"value\":-1},{\"name\":\"男\",\"value\":1},{\"name\":\"女\",\"value\":0}]},{\"title\":\"年龄\",\"parameter\":\"age\",\"content\":[{\"name\":\"不限\",\"value\":-1},{\"name\":\"25岁以下\",\"value\":0},{\"name\":\"25-35岁\",\"value\":1},{\"name\":\"35岁以上\",\"value\":2}]},{\"title\":\"距离\",\"parameter\":\"distance\",\"content\":[{\"name\":\"不限\",\"value\":-1},{\"name\":\"5公里\",\"value\":5},{\"name\":\"10公里\",\"value\":10}]},{\"title\":\"认证\",\"parameter\":\"authentication\",\"content\":[{\"name\":\"不限\",\"value\":-1},{\"name\":\"实名认证\",\"value\":3},{\"name\":\"视频认证\",\"value\":4}]},{\"title\":\"类别\",\"parameter\":\"skillTypeid\",\"content\":[{\"name\":\"不限\",\"value\":-1},{\"name\":\"看电影\",\"value\":93},{\"name\":\"k歌\",\"value\":94},{\"name\":\"吃饭\",\"value\":95},{\"name\":\"下午茶\",\"value\":96},{\"name\":\"逛街\",\"value\":97},{\"name\":\"球类\",\"value\":98},{\"name\":\"美容\",\"value\":99},{\"name\":\"健身\",\"value\":100},{\"name\":\"教育\",\"value\":101},{\"name\":\"其它\",\"value\":102}]},{\"title\":\"费用\",\"parameter\":\"cost\",\"content\":[{\"name\":\"不限\",\"value\":-1},{\"name\":\"免费\",\"value\":0},{\"name\":\"收费\",\"value\":1}]}]}"); list=gson.fromJson(aa.optString("data"),new TypeToken<ArrayList<RespScreen>>(){}.getType()); success(); } catch (JSONException e) { e.printStackTrace(); } } private void success(){ lv_container.setAdapter(new CommonAdapter<RespScreen>(list,getApplicationContext(),R.layout.item_screen) { @Override public void convert(ViewHolderUtils holder, final RespScreen respScreen, int position) { holder.setText(R.id.tv_tagTitle,respScreen.title!=null?respScreen.title:""); TagCloudLayout tagCloudLayout=holder.getView(R.id.container); final TagBaseAdapter mAdapter = new TagBaseAdapter(ScreenActivity.this,respScreen.content); tagCloudLayout.setAdapter(mAdapter); tagCloudLayout.setItemClickListener(new TagCloudLayout.TagItemClickListener() { @Override public void itemClick(int position) { for (int i=0;i<respScreen.content.size();i++){ respScreen.content.get(i).isCheck=false; } respScreen.content.get(position).isCheck=true; mAdapter.notifyDataSetChanged(); } }); } }); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_affirm: List<CheckScreen> checkScreenList=filtrate(); if (checkScreenList!=null&&checkScreenList.size()>0){
Toast.makeText(application, "当前被选中的标签"+gson.toJson(checkScreenList), Toast.LENGTH_SHORT).show();}else{ Toast.makeText(application, "请选择筛选类型!", Toast.LENGTH_SHORT).show(); } break; } } /** * 筛选选中的标签,并放入新集合 */ private List<CheckScreen> filtrate(){ List<CheckScreen> checkScreenList=null; if (list!=null&&list.size()>0){ checkScreenList=new ArrayList<>(); for (int i=0;i<list.size();i++){ List<TagBean> tagBean=list.get(i).content; if (tagBean!=null&&tagBean.size()>0){ for (int j=0;j<tagBean.size();j++){ if (tagBean.get(j).isCheck){ CheckScreen checkScreen=new CheckScreen(); checkScreen.title=list.get(i).title; checkScreen.parameter=list.get(i).parameter; checkScreen.name=tagBean.get(j).name; checkScreen.value=tagBean.get(j).value; checkScreenList.add(checkScreen); } } } } } return checkScreenList; }}
public class TagBaseAdapter extends BaseAdapter { private Context mContext; private List<TagBean> mList; public TagBaseAdapter(Context context,List<TagBean> list){ mContext=context; mList=list; } @Override public int getCount() { return mList.size(); } @Override public Object getItem(int position) { return mList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.tagview, null); holder = new ViewHolder(); holder.tagBtn = (Button) convertView.findViewById(R.id.tag_btn); convertView.setTag(holder); }else{ holder = (ViewHolder)convertView.getTag(); } TagBean bean = (TagBean) getItem(position); holder.tagBtn.setTextSize(12); holder.tagBtn.setText(bean.name); if (bean.isCheck){ holder.tagBtn.setTextColor(mContext.getResources().getColor(R.color.orange)); } return convertView; } static class ViewHolder { Button tagBtn; } }布局文件item_screen
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp"> <TextView android:id="@+id/tv_tagTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="@dimen/text_size_small" android:textColor="@color/black" android:layout_marginTop="10dp" android:text="性别"/> <com.zqlwl.whoAroud.view.screen.TagCloudLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="wrap_content" app:tagSpacing="20dp" app:lineSpacing="10dp" android:layout_marginLeft="10dp" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/gray" android:layout_marginLeft="10dp"/> </LinearLayout>java bean
public class RespScreen implements Serializable{ @Expose @SerializedName("title") public String title; @Expose @SerializedName("parameter") public String parameter; @Expose @SerializedName("content") public List<TagBean> content; }public class TagBean implements Serializable{ @Expose @SerializedName("name") public String name; @Expose @SerializedName("value") public String value; @Expose @SerializedName("isCheck") public boolean isCheck; }public class CheckScreen { @Expose @SerializedName("title") public String title; @Expose @SerializedName("parameter") public String parameter; @Expose @SerializedName("name") public String name; @Expose @SerializedName("value") public String value; @Expose @SerializedName("isCheck") public boolean isCheck; }最后说一个CommonAdapter是一个万能adapter,我会在下一篇文章中单独介绍