您的位置:首页 > 其它

ListView中BaseAdapter使用CheckBox及其细节操作(8.25)

2015-08-25 19:52 447 查看
这个与下面的不同之处在与没有设置存入CheckBox状态的数组而是在fruit类中添加了一个boolean类型的变量来村不同的状态重点在下面
先创建Listview布局

fruit的单条布局

创建fruit类

创建适配器

主程序

现有阶段全部功能的BroadAdapter带有CheckBox的
ListView布局activity_mainxml

Fruit布局fruitxml更改单条背景时修改此地方

Footer布局footerxml本例中把footer和header引入时放反了

Header布局headerxml

Fruit类Fruit

FruitAdapter适配类可谓精髓

MainActivity

<ListView
        //设定缓存时的颜色
        android:cacheColerHint="#00000000"
        //设定分隔线的颜色
        android:divider=""
        //设定分隔线的宽度
        android:dividerHeight=""


这个与下面的不同之处在与没有设置存入CheckBox状态的数组,而是在fruit类中添加了一个boolean类型的变量,来村不同的状态。(重点在下面

列表内容



先创建Listview布局

只含有list布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

   <ListView
       android:id="@+id/listview"
       android:layout_width="match_parent"
       android:layout_height="match_parent"></ListView>

</RelativeLayout>


fruit的单条布局

<?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">
    <CheckBox
        android:id="@+id/checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:focusable="false"
        android:text="请选择"/>
    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>


创建fruit类

public class Fruit {
    private String name;
    private boolean checkBox;
    private int imageView;
    public Fruit(String name, int imageView) {
        this.name = name;

        this.imageView = imageView;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean getCheckBox() {
        return checkBox;
    }

    public void setCheckBox(boolean checkBox) {
        this.checkBox = checkBox;
    }

    public int getImageView() {
        return imageView;
    }

    public void setImageView(int imageView) {
        this.imageView = imageView;
    }
}


创建适配器

package com.test.dukang.fruit;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import java.util.List;

/**
 * Created by Administrator on 2015/8/25.
 */
public class FruitAdapter extends BaseAdapter {
    private boolean mAllCheckStation[];
    public FruitAdapter(List<Fruit> mList, LayoutInflater inflater) {
        this.mList = mList;
        this.inflater = inflater;
        mAllCheckStation=new boolean[mList.size()];
    }

    private List<Fruit> mList;
    private LayoutInflater inflater;
    public void itemSelect(int position){
        mAllCheckStation[position]=!mAllCheckStation[position];
        notifyDataSetChanged();
    }
    @Override
    public int getCount() {
        return mList.size();
    }

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

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

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
       ViewHolder viewHolder=null;
        int count=0;
        if(convertView==null){
            convertView=inflater.inflate(R.layout.fruit,null);
            viewHolder=new ViewHolder();
            viewHolder.name= (TextView) convertView.findViewById(R.id.textView);
            viewHolder.imageView= (ImageView) convertView.findViewById(R.id.image);
            viewHolder.checkBox= (CheckBox) convertView.findViewById(R.id.checkbox);
            convertView.setTag(viewHolder);
            count++;
            Log.d("data",""+count);
        }else {
            count++;
            Log.d("data",""+count);
            viewHolder= (ViewHolder) convertView.getTag();
        }
         Fruit fuit=mList.get(position);
        viewHolder.imageView.setImageResource(fuit.getImageView());
        viewHolder.name.setText(fuit.getName());
        viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                Log.d("data", "发生变化" + isChecked);
                mList.get(position).setCheckBox(isChecked);

              mAllCheckStation[position]=isChecked;
             notifyDataSetChanged();
            }
        });
       // //mAllCheckStation[position]
      //  viewHolder.checkBox.setChecked(fuit.getCheckBox());
        viewHolder.checkBox.setChecked(mAllCheckStation[position]);
        return convertView;
    }
    class ViewHolder{
        TextView name;
        ImageView imageView;
        CheckBox checkBox;
    }
}


主程序

package com.test.dukang.fruit;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private List<Fruit> list;
    private ListView listView;
    private FruitAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        list=new ArrayList<>();
        init();
        listView= (ListView) findViewById(R.id.listview);
        LayoutInflater inflater=getLayoutInflater();
         adapter = new FruitAdapter(list,inflater);

        listView.setAdapter(adapter);
        //设置使其点击listView的一条就可以操作CheckBox
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                adapter.itemSelect(position);
            }
        });

    }
    public void init(){
        for (int i=0;i<30;i++) {
            Fruit fruit = new Fruit("苹果", R.mipmap.clear_after);
            Fruit fruit2 = new Fruit("西瓜", R.mipmap.m);
            Fruit fruit3 = new Fruit("黄瓜", R.mipmap.ic_launcher);
            list.add(fruit);
            list.add(fruit2);
            list.add(fruit3);
        }
    }

}


现有阶段全部功能的BroadAdapter带有CheckBox的。

ListView布局(activity_main.xml)

只含有ListView布局,其他功能参考博客开始时的内容

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

<ListView
    android:id="@+id/listview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"></ListView>

</RelativeLayout>


Fruit布局(fruit.xml)(更改单条背景时修改此地方)

设置单条显示的形式

<!--添加此条可以是单条View的整条框都可以被点击-->
android:focusable="false"
<?xml version="1.0" encoding="utf-8"?>
<!--给LinearLayout添加背景,设置选中未选中状态-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">
    <CheckBox
        android:id="@+id/checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:focusable="false"
        android:text="请选择"/>
    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>


Footer布局(footer.xml)(本例中把footer和header引入时,放反了。)

在ListView的下面添加一个不同于之前的布局,此例只放了一个Button,

<?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">
    <!--记得给组件添加id-->
    <Button
        android:id="@+id/checkAll"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="全选"/>
</LinearLayout>


Header布局(header.xml)

在ListView的上面添加一个不同于之前的布局,此例只放了一个Button,

<?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">
    <Button
        android:id="@+id/checkfan"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="反选"/>
</LinearLayout>


Fruit类(Fruit)

一个简单的Fruit类

package com.test.dukang.fruit;
import android.media.Image;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;

/**
* Created by Administrator on 2015/8/25.
*/
public class Fruit { private String name; private boolean checkBox; private int imageView; public Fruit(String name, int imageView) { this.name = name; this.imageView = imageView; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean getCheckBox() { return checkBox; } public void setCheckBox(boolean checkBox) { this.checkBox = checkBox; } public int getImageView() { return imageView; } public void setImageView(int imageView) { this.imageView = imageView; } }


FruitAdapter(适配类,可谓精髓)

package com.test.dukang.fruit;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import java.util.List;

/**
 * Created by Administrator on 2015/8/25.
 */
public class FruitAdapter extends BaseAdapter {
    //创建Fruit的集合类
    private List<Fruit> mList;
     //得到主布局中的内容填充器
    private LayoutInflater inflater;
    //用一个数组来保存所有CheckBox的状态
    private boolean mAllCheckStation[];
    public FruitAdapter(List<Fruit> mList, LayoutInflater inflater) {
        this.mList = mList;
        this.inflater = inflater;
        //用list的长度来设定数组的长度
        mAllCheckStation=new boolean[mList.size()];
    }
    /**
     *添加全选的方法
     */

    public void itemCheckAll(){
        for (int i = 0; i <mAllCheckStation.length ; i++) {

            mAllCheckStation[i]=true;
            //更改后立即更新
            notifyDataSetChanged();
        }
    }
    /**
     *添加反选的方法
     */
    public void itemCheckFan() {
        for (int i = 0; i <mAllCheckStation.length ; i++) {
            mAllCheckStation[i]=!mAllCheckStation[i];
            notifyDataSetChanged();
        }
    }
    /**
     *添加单击一条时可以选中CheckBox
     */
    public void itemSelect(int position){
        //通过position得到需要的数据
        mAllCheckStation[position]=!mAllCheckStation[position];
        notifyDataSetChanged();
    }
    @Override
    public int getCount() {
        return mList.size();
    }

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

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

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        //添加自定义的缓存区
       ViewHolder viewHolder=null;
        if(convertView==null){
              "望不要忘了写该句,给covertView传入值"
            //covertView为传递过来的View
            convertView=inflater.inflate(R.layout.fruit,null);
            //用缓存器去得到id
            "也不要忘了初始化自定义的对象"
            viewHolder=new ViewHolder();
            viewHolder.name= (TextView) convertView.findViewById(R.id.textView);
            viewHolder.imageView= (ImageView) convertView.findViewById(R.id.image);
            viewHolder.checkBox= (CheckBox) convertView.findViewById(R.id.checkbox);
            //注意设置标志位
            convertView.setTag(viewHolder);

        }else {

            //得到标志位,避免再一次获取id
            viewHolder= (ViewHolder) convertView.getTag();
        }
        //得到集合中的数据
         Fruit fuit=mList.get(position);
        viewHolder.imageView.setImageResource(fuit.getImageView());
        viewHolder.name.setText(fuit.getName());
        viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            //设置点击意图
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                Log.d("data", "发生变化" + isChecked);
                mList.get(position).setCheckBox(isChecked);
            //将CheckBox的状态值存入数组
              mAllCheckStation[position]=isChecked;
              //立即刷新界面
             notifyDataSetChanged();
            }
        });
        ////这些是在程序中注释的不要在意
       // //mAllCheckStation[position]
      //  //viewHolder.checkBox.setChecked(fuit.getCheckBox());
        viewHolder.checkBox.setChecked(mAllCheckStation[position]);
        //注意返回值
        return convertView;
    }

    /**
     *自己添加的ViewHolder类
     */
    class ViewHolder{
        TextView name;
        ImageView imageView;
        CheckBox checkBox;
    }
}


MainActivity

package com.test.dukang.fruit;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    //将要用到的变量设置为全局变量,设置Fruit的集合
    private List<Fruit> list;
    //设置ListView,以便得到布局中的ListView
    private ListView listView;
    //得到适配器,以便使用和调用方法
    private FruitAdapter adapter;
    //得到活动中的inflater
    private LayoutInflater inflater;

    //下面分别为footer和header的使用,取得其中的控件
    private View mHeaderView;
    private Button mBtnCheckedAll;
    private View mFooterView;
    private Button mBtnCheckedfan;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //传入带ListView的布局文件
        setContentView(R.layout.activity_main);
        //创建一个集合,一定要在主类中创建
        list=new ArrayList<>();
        //初始化数据
        init();
        //用id得到listView
        listView= (ListView) findViewById(R.id.listview);
        //得到填充器
        inflater=getLayoutInflater();
        //用FruitAdapter的构造器,传递所需的参数
        adapter = new FruitAdapter(list,inflater);  
          //设置footer,因为本例中引入反了,
          "注意传入的布局"
                                     mHeaderView=inflater.inflate(R.layout.footer,null);
        //得到布局中的button                             
        mBtnCheckedAll = (Button) mHeaderView.findViewById(R.id.checkAll);
        //给button设置点击事件
        mBtnCheckedAll.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                adapter.itemCheckAll();
            }
        });
        //注意一定要添加到ListView中
        listView.addFooterView(mHeaderView);
        //用法相同

        mFooterView=inflater.inflate(R.layout.header,null);
        mBtnCheckedfan= (Button) mFooterView.findViewById(R.id.checkfan);
        mBtnCheckedfan.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                adapter.itemCheckFan();
            }
        });
        listView.addHeaderView(mFooterView);
        //添加适配器
        listView.setAdapter(adapter);
        //设置一条的点击事件
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //通过position传递数据给CheckBox,注意只有当设置Header时,这里的position才减一,注意只有这里的。
                "当没有时直接传入position"
                adapter.itemSelect(position-1);
            }
        });

    }
    /**
     *初始化数据
     */
    public void init(){
        for (int i=0;i<30;i++) {
            Fruit fruit = new Fruit("苹果", R.mipmap.clear_after);
            Fruit fruit2 = new Fruit("西瓜", R.mipmap.m);
            Fruit fruit3 = new Fruit("黄瓜", R.mipmap.ic_launcher);
            list.add(fruit);
            list.add(fruit2);
            list.add(fruit3);
        }
    }

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: