android开发之&动态筛选标签页(类似评论筛选标签)

一个标签选择控件,类似于评价标签,已经实现点击事件选中效果,由于业务需要,我做的是使用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,我会在下一篇文章中单独介绍


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值