GridView中item的多选实现

由于项目需要,所以就写了一个demo,记录到博客中。
GridView中item的单选的实现,请点击

消除点击GridView的item默认的颜色,请点击

接下来言归正传,开始今天的重点;

1.先上布局文件:
MainActivity的布局 activity_layout;

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.hbh.hbhforworkers.foreman.MainActivity">

        <GridView
            android:id="@+id/grid_view"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:numColumns="3"/>

</LinearLayout>

GridView适配器的布局item_grid_view.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/tv_tags_item"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/tags_bg_color_seletor"
        android:gravity="center"
        android:paddingBottom="3dip"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:paddingTop="3dip"
        android:textColor="@drawable/tags_text_color_seletor"
        android:textSize="15sp" >
    </TextView>

    <CheckBox
        android:id="@+id/tags_checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignEnd="@id/tv_tags_item"
        android:layout_alignRight="@id/tv_tags_item"
        android:layout_alignTop="@id/tv_tags_item"
        android:checked="false"
        android:clickable="false"
        android:focusable="false"
        android:visibility="gone" />

</RelativeLayout>

2.drawable下面的一些xml文件,布局中用到的;
tags_bg_color_seletor.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_selected="true" android:drawable="@drawable/tags_select_shape"/>
    <item android:state_pressed="true" android:drawable="@drawable/tags_select_shape"/>
    <item android:state_selected="false" android:drawable="@drawable/tags_not_select_shape"/>

</selector>

tags_select_shape.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <gradient android:angle="90" />
    <solid android:color="#FFA500"/>
</shape>

tags_not_select_shape.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <gradient android:angle="90" />
    <solid android:color="#ffffff"/>
</shape>

tags_text_color_seletor.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_selected="true" android:color="@color/white"/>
    <item android:state_pressed="true" android:color="@color/white"/>
    <item android:state_selected="false" android:color="@color/black"/>

</selector>

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
    <color name="white">#FFFFFF</color>
    <color name="black">#000000</color>
    <color name="orange">#FFA500</color>
</resources>

3.代码
javabean

public class Info implements Serializable {
    public String name;

    public Info(String name) {
        this.name = name;
    }
}

adapter

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.TextView;
import java.util.List;


public class GridViewAdapter extends BaseAdapter {
    private List<Info> tagList;
    private Context context;
    private TagHolder mHolder = null;
    private int clickTemp = -1;
    OnItemClickClass onItemClickClass;

    public GridViewAdapter(List<Info> tagList, Context context, OnItemClickClass onItemClickClass) {
        this.tagList = tagList;
        this.context = context;
        this.onItemClickClass = onItemClickClass;
    }

    public void setSelection(int choiceCount) {
        this.clickTemp = choiceCount;
    }

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

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.item_grid_view, null);
            mHolder = new TagHolder();
            mHolder.textView = (TextView) convertView.findViewById(R.id.tv_tags_item);
            mHolder.checkBox = (CheckBox) convertView.findViewById(R.id.tags_checkbox);
            convertView.setTag(mHolder);
        } else {
            mHolder = (TagHolder) convertView.getTag();
        }
        mHolder.textView.setText(tagList.get(position).name);
        mHolder.checkBox.setVisibility(View.GONE);

        //设置被选中和取消选中条目的状态
        if (clickTemp == position) {
            mHolder.textView.setSelected(true);
        } else {
            mHolder.textView.setSelected(false);
        }
        convertView.setOnClickListener(new OnTextClick(position, mHolder.checkBox, mHolder.textView));
        return convertView;
    }

    static class TagHolder {
        TextView textView;
        CheckBox checkBox;
    }

    /** 点击多选的接口 */
    public interface OnItemClickClass {
        public void OnItemClick(View v, int Position, CheckBox checkBox, TextView textView);
    }

    /** 多选的接口实现类 */
    class OnTextClick implements View.OnClickListener {

        int position;
        CheckBox checkBox;
        TextView tvSelected = null;
        TextView textView = null;

        public OnTextClick(int position, CheckBox checkBox) {
            this.position = position;
            this.checkBox = checkBox;
        }

        public OnTextClick(int position, CheckBox checkBox, TextView textView) {
            this.position = position;
            this.checkBox = checkBox;
            this.textView = textView;
        }

        @Override
        public void onClick(View v) {
            if (tagList != null && onItemClickClass != null) {
                onItemClickClass.OnItemClick(v, position, checkBox, textView);
            }
        }
    }
}

activity

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.CheckBox;
import android.widget.GridView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private GridView mGridView;
    List<Info> infos = new ArrayList<>();
    List<Info> selecteds = new ArrayList<>();
    GridViewAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Info one = new Info("广岛");
        Info two = new Info("长崎");
        Info three = new Info("东京");
        Info four = new Info("冲绳");
        Info five = new Info("北海道");
        Info six = new Info("大阪");
        Info seven = new Info("八户");
        Info eight = new Info("京都");
        infos.add(one);
        infos.add(two);
        infos.add(three);
        infos.add(four);
        infos.add(five);
        infos.add(six);
        infos.add(seven);
        infos.add(eight);
        mGridView = (GridView) findViewById(R.id.grid_view);
        adapter = new GridViewAdapter(infos, this, onItemClickClass);
        mGridView.setAdapter(adapter);
    }

    /** 实现接口,点击选中或者取消选中,并获取其被选中的集合 */
    GridViewAdapter.OnItemClickClass onItemClickClass = new GridViewAdapter.OnItemClickClass() {
        @Override
        public void OnItemClick(View v, int position, CheckBox checkBox, TextView textView) {
            if (checkBox.isChecked()) {  // 选中的
                checkBox.setChecked(false);
                textView.setBackgroundColor(getResources().getColor(R.color.white));
                textView.setTextColor(getResources().getColor(R.color.black));
                for (int i = 0; i < selecteds.size(); i++) {
                    if (textView.getText().toString().trim().equals(selecteds.get(i).name)) {
                        selecteds.remove(i);
                    }
                }
            } else {
                Info mInfo = infos.get(position);
                checkBox.setChecked(true);
                textView.setBackgroundColor(getResources().getColor(R.color.orange));
                textView.setTextColor(getResources().getColor(R.color.white));
                selecteds.add(mInfo);
            }
            for (Info info : selecteds) {
                Log.e("选中的 = ", info.name);
            }
        }
    };
}

demo下载请点击

顺便推广一下,RecyclerView的下拉刷新和上拉加载,博客是有时间写,这里先上demo
RecyclerView刷新加载不同type

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值