Android最常用的ListView解决方案大集合

实现以上效果需解决

1选择苹果时并不是所有的苹果都被选中

2解决如果是几千条数据,等大数据带来的程序崩溃问题

3实现添加头部和脚部

4全选和反选

java源码部分

FruitAdapter
public class FruitAdapter extends BaseAdapter {
    private List<Fruit> mFruits;
    private LayoutInflater Inflater;
    private boolean[] mManagerAllCheckBox;

    public FruitAdapter(LayoutInflater Inflater, List fruits) {
        this.Inflater = Inflater;
        this.mFruits = fruits;
        mManagerAllCheckBox = new boolean[fruits.size()];
    }

    /**
     * 全选
     */
    public void selectAll() {
        for (int i = 0; i < mFruits.size(); i++) {
            mManagerAllCheckBox[i] = true;
            notifyDataSetChanged();
        }

    }

    public void selectFan() {
        for (int i = 0; i < mFruits.size(); i++) {
            mManagerAllCheckBox[i] = !mManagerAllCheckBox[i];
            notifyDataSetChanged();
        }
    }

    /**
     * 点击Item选择CheckBox
     */
    public void select(int position) {
        mManagerAllCheckBox[position] = !mManagerAllCheckBox[position];
        notifyDataSetChanged();

    }

    @Override

    public int getCount() {
        return mFruits.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不必每一个item都生成view,使得运行内存大大减少
        ViewHolder vh = null;
        Fruit fruit = mFruits.get(position);
        if (convertView == null) {
          //别忘了生成对象,否则报空指针
            vh = new ViewHolder();
            //LayoutInflater把XML转化为view
            convertView = Inflater.inflate(R.layout.list_fruit, null);
            vh.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox);
            vh.imageView = (ImageView) convertView.findViewById(R.id.image_fruit);
            vh.textView = (TextView) convertView.findViewById(R.id.textview_name);
            convertView.setTag(vh);
        } else {
            vh = (ViewHolder) convertView.getTag();
        }

        vh.textView.setText(fruit.getName());
        vh.imageView.setImageResource(fruit.getImg());
        vh.checkBox.setChecked(mManagerAllCheckBox[position]);
        return convertView;
    }

    class ViewHolder {
        TextView textView;
        ImageView imageView;
        CheckBox checkBox;

    }
}

MyFruitAdapterActivity

public class MyFruitAdapterActivity extends AppCompatActivity {
    private ListView mListView;
    private List<Fruit> mFruits;
    private FruitAdapter fruitAdapter;
    private LayoutInflater inflater;
    private View mListViewFoot;
    private View mListViewHead;
    private Button mButtonSeleckAll;
    private Button mButtonSeleckFan;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listview);
        mListView = (ListView) findViewById(R.id.listview1);
        //LayoutInflater作用是将layout的xml布局文件实例化为View类对象。
        inflater = getLayoutInflater();
        //调用初始化数据方法
        initData();

        //FruitAdapter需要传递两个参数类型LayoutInflater , List
        fruitAdapter = new FruitAdapter(inflater, mFruits);
        //把适配器添加到ListView

       //通过LayoutInflater的inflater对象实例化为XML文件的View类对象
        mListViewFoot = inflater.inflate(R.layout.list_foot, null);
        mListViewHead = inflater.inflate(R.layout.list_head, null);

        //通过View类对象使用findViewById
        mButtonSeleckAll= (Button) mListViewHead.findViewById(R.id.select_all);
        mButtonSeleckFan= (Button) mListViewFoot.findViewById(R.id.select_fan);

        //添加首尾,传入View类型参数
        mListView.addFooterView(mListViewFoot);
        mListView.addHeaderView(mListViewHead);

        //将适配器添加到ListView
        //注意此行的位置
        mListView.setAdapter(fruitAdapter);
         //全选按钮点击事件
        mButtonSeleckAll.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                fruitAdapter.selectAll();
            }
        });
        //反选按钮点击事件
        mButtonSeleckFan.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                fruitAdapter.selectFan();
            }
        });

        //给ListView的每一个item添加点击事件
        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.d("myfruit", "选中了" + mFruits.get(position - 1).getName());
                fruitAdapter.select(position-1 );
            }
        });
    }

    //这样是重复的对象,当选中的时候会都选中
//    public void initData() {
//        mFruits = new ArrayList<>();
//        Fruit apple = new Fruit("苹果", R.mipmap.a_logo1);
//        Fruit banana = new Fruit("苹果", R.mipmap.a_logo1);
//        Fruit grape = new Fruit("苹果", R.mipmap.a_logo1);
//        for (int i = 0; i < 5; i++) {
//            mFruits.add(apple);
//            mFruits.add(banana);
//            mFruits.add(grape);
//        }
//    }
    //这样
    public void initData() {
        mFruits = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            Fruit apple = new Fruit("苹果", R.mipmap.apple);
            Fruit banana = new Fruit("香蕉", R.mipmap.banana);
            Fruit grape = new Fruit("葡萄", R.mipmap.grape);
            mFruits.add(apple);
            mFruits.add(banana);
            mFruits.add(grape);

        }

    }
}

Fruit

public class Fruit {
    private String name;
    private int img;

    public  Fruit( String name, int img){
        this.name=name;
        this.img=img;

    }

    public String getName() {
        return name;
    }

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

    public int getImg() {
        return img;
    }

    public void setImg(int img) {
        this.img = img;
    }

}

XML源码部分

listview.xml

list_fruit.xml

list_foot.xml

list_head.xml

listview.xml

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

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

    </ListView>

</LinearLayout>

list_fruit.xml

<?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"
    android:orientation="horizontal">

    <CheckBox
        android:id="@+id/checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
       android:layout_margin="30dp"

        android:focusable="false"/> <!---->

    <ImageView
        android:id="@+id/image_fruit"
        android:layout_width="100dp"
        android:layout_height="100dp" />
    <TextView
        android:id="@+id/textview_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:layout_marginLeft="10dp"/>
</LinearLayout>

list_foot.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/select_fan"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="反选"/>

</LinearLayout>

list_head.xml

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

    <Button
        android:id="@+id/select_all"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="全选"/>

</LinearLayout>

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 08:15:50

Android最常用的ListView解决方案大集合的相关文章

iOS常用控件尺寸大集合

元素控件 尺寸(pts) Window(含状态栏) 320 x 480 Status Bar的高度 20 Navigation Bar的高度 44 含Prompt的Navigation Bar的高度 74 Navigation Bar的图标 20×20(透明的png) Tool Bar的高度 44 Tool Bar的图标 20×20(透明的png) Tab Bar的高度 49 Tab Bar的图标 30×30(透明的png) 竖直时键盘的高度 216.252(iOS 5+的中文键盘) 水平时键盘

Android平台下渗透测试工具大集合

Android平台下渗透测试工具大集合 分享一个google的项目,各种Android下的渗透测试工具. Ad Network Detector (1.2): http://market.android.com/details?id=com.lookout.addetector App Backup & Restore (1.0.5): http://market.android.com/details?id=mobi.infolife.appbackup App Cache Cleaner (

windows常用服务和命令大集合(攻略版)

windows运行命令大集合,学完以后,你就会对windows系列系统了如指掌,处理故障问题就会事半功倍,领导也会慢慢的器重你,提升你在公司的价值地位. 下面一一介绍: winver 检查Windows版本 wmimgmt.msc 打开Windows管理体系结构(wmi) wupdmgr Windows更新程序 w脚本 Windows脚本宿主设置 write 写字板 winmsd 系统信息 wiaacmgr 扫描仪和照相机向导 winchat xp自带局域网聊天 mem.exe 显示内存使用情况

Android 按钮常用点击事件大总结

很多学习Android程序设计的人都会发现每个人对代码的写法都有不同的偏好,比较明显的就是对控件响应事件的写法的不同.因此本文就把这些写法总结一下,比较下各种写法的优劣,希望对大家灵活地选择编码方式可以有一定的参考借鉴价值. xml文件代码如下: <Button     android:id="@+id/button1"     android:layout_width="wrap_content"     android:layout_height=&quo

边缘计算的解决方案大集合

自今年2月的巴塞罗那世界移动通信大会召开以来,边缘计算无疑是C位出道,爆发释放在人们的视野中,成为今年业界最热门的领域之一.顺着5G的东风,边缘计算的诞生成为历史必然,整个行业都在进行战略布局,全球最强的两大开源社区OpenStack和Linux也陆续推出了边缘计算解决方案.今天这篇主要为大家详解OpenStack和Linux社区开源的几个和边缘数据中心以及边缘服务提供商相关的边缘计算解决方案. 这些方案离边缘设备较远,但是也是整个边缘体系中不可或缺的后台方案,主要是Linux基金会下的Akra

”未在本地计算机上注册“microsoft.et.OLEDB.4.0”提供程序。“解决方案大集合

本人在做一个连接Access数据库的时候,程序扔给我一个如此Bug——“未在本地计算机上注册“microsoft.et.OLEDB.4.0”, 请教度娘,告诉我可能是如下因素: 一.“设置应用程序池默认属性”/“常规”/”启用32位应用程序”,设置为 true."如图:(适用于安装IIS7.0用户) 偶的不是网站,臣妾办不到,Next 二.方法二:生成->配置管理器->平台->点击Any Cpu选项卡->新建->新建平台->X86. 如下图所示: 改过还是木有

Android中ScrollView嵌套ListView只显示一行的解决方案

Android中ScrollView嵌套ListView只显示一行的解决方案 解决方案1: 直接把包含ListView控件的ScrollView控件从布局文件中去除,留下ListView控件,这是最简单快捷的解决办法. 如果一定要在ScrollView中包含ListView,则参考 解决方案2: public void showlist() { List<HashMap<String, String>> dataHashMaps = new ArrayList<HashMap

Android开发之适配器-ListView适配器的重复数据

适配器是Android中的数据与View视图的桥梁,作用就是将数据通过适配器显示到对应的View视图上. 工作中,在用ListView做适配器数据时候,有些人肯定碰见过,如何优化效率,但是又出现重复数据的情况,如何避免重复数据而且又能提高ListView大数据量时候的效率呢?,解决方案就是2点: 1. 在getView方法中 进行View的判断,即做convertView ==null 这样的判断,这样是为了提高数据量大的时候的效率. 2.设置数据用setTag()/getTag()方法来进行对

【转】Android自定义Adapter的ListView的思路及代码

原文网址:http://www.jb51.net/article/37236.htm Android自定义Adapter的ListView的思路及代码,需要的朋友可以参考一下 在开发中,我们经常使用到ListView这个控件.Android的API也提供了许多创建ListView适配器的快捷方式.例如ArrayAdapter.SimpleAdapter和SimpleCursorAdapter等.但你是否发现,如果采用这些系统自带的适配器,对于事件的响应只能局限在一个行单位.假设一行里面有一个按钮