关于android“多选”的小研究

[color=blue][size=large] 转载请注明出处:http://heji.iteye.com/blog/731310[/size][/color]

android里面自带有多选的布局,文件名是:simple_list_item_multiple_choice.xml,它的源码如下:

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2008 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:textAppearance="?android:attr/textAppearanceLarge"
android:gravity="center_vertical"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:paddingLeft="6dip"
android:paddingRight="6dip"
/>

是一个CheckedTextView的组件。只能实现一个TextView和一个CheckBox的组件。在开发中肯定是不能满足我们的需求的。貌似与它绑定的好像只有ArrayAdapter。什么SimpleAdapter,SimpleCursorAdapter这些Adapter不能与之绑定,看看构造函数就知道了。怎么才能更佳美化我们的ListView的UI呢?只有一个办法,重写一个Adapter,来适配我们的自己的ListView。
下面这个是需要现实在ListView中的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/row"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>

<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content">

<ImageView android:id="@+id/tag"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/icon"/>

<LinearLayout android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:orientation="vertical"
android:layout_marginTop="7dip"
android:layout_toRightOf="@id/tag"
>

<TextView android:id="@+id/multiple_title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:textSize="20dip"
android:layout_marginLeft="5dip"/>


<TextView android:id="@+id/multiple_summary"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:gravity="center_vertical"/>

</LinearLayout>

<!--
这三个很重要
android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"
-->
<CheckBox
android:id="@+id/multiple_checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginTop="6dip"
android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"
android:layout_alignParentRight="true"/>

</RelativeLayout>

</LinearLayout>

这个文件是Activity的布局文件:

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

<ListView android:id="@+id/listview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:cacheColorHint="#00000000"
/>

</LinearLayout>

有了上面的两个文件,就可以写Activity了~~~~
下面的是源码:

package com.heji.demo.effect;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;

import com.heji.demo.R;

public class MultipleChoiceActivity extends Activity implements OnItemClickListener{

private MyAdapter mSimpleAdapter;

public final static String NAME = "name";
public final static String PHONE_NUMBER = "phone";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setTitle("带有多选的Listview");

setContentView(R.layout.multiple_checkbox_main);

ListView listView = (ListView) findViewById(R.id.listview);

ArrayList<Map<String, String>> al = new ArrayList<Map<String,String>>();
Map<String, String> map1 = new HashMap<String, String>();

map1.put(NAME, "A");
map1.put(PHONE_NUMBER, "132456789");
al.add(map1);

Map<String, String> map2 = new HashMap<String, String>();
map2.put(NAME, "B");
map2.put(PHONE_NUMBER, "132134");
al.add(map2);

Map<String, String> map3 = new HashMap<String, String>();
map3.put(NAME, "C");
map3.put(PHONE_NUMBER, "132134");
al.add(map3);

Map<String, String> map4 = new HashMap<String, String>();
map4.put(NAME, "D");
map4.put(PHONE_NUMBER, "132134");
al.add(map4);

Map<String, String> map5 = new HashMap<String, String>();
map5.put(NAME, "E");
map5.put(PHONE_NUMBER, "132134");
al.add(map5);

Map<String, String> map6 = new HashMap<String, String>();
map6.put(NAME, "F");
map6.put(PHONE_NUMBER, "132134");
al.add(map6);

Map<String, String> map7 = new HashMap<String, String>();
map7.put(NAME, "G");
map7.put(PHONE_NUMBER, "132134");
al.add(map7);


Map<String, String> map8 = new HashMap<String, String>();
map8.put(NAME, "H");
map8.put(PHONE_NUMBER, "132134");
al.add(map8);

Map<String, String> map9 = new HashMap<String, String>();
map9.put(NAME, "I");
map9.put(PHONE_NUMBER, "132134");
al.add(map9);

Map<String, String> map10 = new HashMap<String, String>();
map10.put(NAME, "J");
map10.put(PHONE_NUMBER, "132134");
al.add(map10);

Map<String, String> map11 = new HashMap<String, String>();
map11.put(NAME, "K");
map11.put(PHONE_NUMBER, "132134");
al.add(map11);


String[] from = { NAME, PHONE_NUMBER };
int[] to = { R.id.multiple_title, R.id.multiple_summary };
mSimpleAdapter = new MyAdapter(this, al, R.layout.multiple_checkbox_main_row, from, to);

listView.setAdapter(mSimpleAdapter);
listView.setOnItemClickListener(this);
}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
CheckBox checkBox = (CheckBox) view.findViewById(R.id.multiple_checkbox);

checkBox.toggle();

mSimpleAdapter.map.put(position, checkBox.isChecked());

}

public class MyAdapter extends SimpleAdapter {

Map<Integer, Boolean> map;

LayoutInflater mInflater;

private List<? extends Map<String, ?>> mList;

public MyAdapter(Context context, List<Map<String, String>> data,
int resource, String[] from, int[] to) {
super(context, data, resource, from, to);
map = new HashMap<Integer, Boolean>();
mInflater = LayoutInflater.from(context);
mList = data;
for(int i = 0; i < data.size(); i++) {
map.put(i, false);
}
}

@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(int position, View convertView, ViewGroup parent) {
if(convertView == null) {
convertView = mInflater.inflate(R.layout.multiple_checkbox_main_row, null);
}
TextView tN = (TextView) convertView.findViewById(R.id.multiple_title);
tN.setText((String)mList.get(position).get(NAME));

TextView tP = (TextView) convertView.findViewById(R.id.multiple_summary);
tP.setText((String)mList.get(position).get(PHONE_NUMBER));

CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.multiple_checkbox);

checkBox.setChecked(map.get(position));

return convertView;
}

}

}


[color=red] [size=large]下面我来分析为什么要用map来保存checkbox的状态。
这个与ListView的刷新机制有关,当你的listview对象很多的时候,每次你拖动listview上下滚动,listview都会刷新一次。怎么刷新呢?比如一个屏幕它最多只显示七条listview,如果你有十条数据,当你想看第八条时,第一条数据理所当然的要被隐藏掉,而第八条数据会被显示,这时listview就刷新了。如果你不保存你所选的checkbox的状态,这时如果你选的是第一条的checkbox的状态为true,当你把余下的第八、第九、第十条数据显示出来时,第十条的checkbox的状态会显示为true,但是它的状态没有被保存,只是你看到它是被选中了而已,其实你选的还是第一条数据。这个问题很操蛋。还有一个更离奇的状态,你让checkbox的状态为true,数据一定要大于十条,你不停的上下拖动屏幕,你会看见checkbox的显示状态会乱跳,但是你实际上选择的还是第一条数据,只是会让你的用户感觉很不爽罢了。难道这个就是android的一个小bug?嘿嘿~~~~
好了,源码我已经贴出来了,希望各路大牛讨论。代码有不对的地方也希望指正,谢谢[/size]~~~~[/color]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值