详谈Android ListView的选择模式

 更新时间:2017年04月18日 09:18:32   投稿:jingxian  
下面小编就为大家带来一篇详谈Android ListView的选择模式。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

效果图:

ListView 定义了choiceMode属性,描述是这样的:

用于为视图定义选择行为。默认情况下,列表时没有任何选择行为的。如果把choiceMode设置为singleChoice,列表允许有一个列表项处于被选状态。如果把choiceMode设置为multipleChoice,那么列表允许有任意数量的列表项处于被选状态

ListView以某种方式通过Checkable接口处理视图的选择状态,LIstView源码中有这么一段:

 if (mChoiceMode != CHOICE_MODE_NONE && mCheckStates != null) {
      if (child instanceof Checkable) {
        ((Checkable) child).setChecked(mCheckStates.get(position));
      } else if (getContext().getApplicationInfo().targetSdkVersion
          >= android.os.Build.VERSION_CODES.HONEYCOMB) {
        child.setActivated(mCheckStates.get(position));
      }
    }

如果需要ListView处理选择行为,需要令列表项对应的自定义视图实现Checkable接口,这个需要自定义

创建一个Countries.java

public class Countries {
 public static final String[] COUNTRIES = new String[] {
   "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra",
   "Angola", "Anguilla", "Antarctica", "Antigua and Barbuda",
   "Argentina", "Armenia", "Aruba", "Australia", "Austria",
   "Azerbaijan", "Bahrain", "Bangladesh", "Barbados", "Belarus",
   "Belgium", "Belize", "Benin", "Bermuda", "Bhutan", "Bolivia",
   "Bosnia and Herzegovina", "Botswana", "Bouvet Island", "Brazil",
   "British Indian Ocean Territory", "British Virgin Islands",
   "Brunei", "Bulgaria", "Burkina Faso", "Burundi", "Cote d'Ivoire",
   "Cambodia", "Cameroon", "Canada", "Cape Verde", "Cayman Islands",
   "Central African Republic", "Chad", "Chile", "China",
   "Christmas Island", "Cocos (Keeling) Islands", "Colombia",
   "Comoros", "Congo", "Cook Islands", "Costa Rica", "Croatia",
   "Cuba", "Cyprus", "Czech Republic",
   "Democratic Republic of the Congo", "Denmark", "Djibouti",
   "Dominica", "Dominican Republic", "East Timor", "Ecuador",
   "Egypt", "El Salvador", "Equatorial Guinea", "Eritrea",
   "Estonia", "Ethiopia", "Faeroe Islands", "Falkland Islands",
   "Fiji", "Finland", "Former Yugoslav Republic of Macedonia",
   "France", "French Guiana", "French Polynesia",
   "French Southern Territories", "Gabon", "Georgia", "Germany",
   "Ghana", "Gibraltar", "Greece", "Greenland", "Grenada",
   "Guadeloupe", "Guam", "Guatemala", "Guinea", "Guinea-Bissau",
   "Guyana", "Haiti", "Heard Island and McDonald Islands",
   "Honduras", "Hong Kong", "Hungary", "Iceland", "India",
   "Indonesia", "Iran", "Iraq", "Ireland", "Israel", "Italy",
   "Jamaica", "Japan", "Jordan", "Kazakhstan", "Kenya", "Kiribati",
   "Kuwait", "Kyrgyzstan", "Laos", "Latvia", "Lebanon", "Lesotho",
   "Liberia", "Libya", "Liechtenstein", "Lithuania", "Luxembourg",
   "Macau", "Madagascar", "Malawi", "Malaysia", "Maldives", "Mali",
   "Malta", "Marshall Islands", "Martinique", "Mauritania",
   "Mauritius", "Mayotte", "Mexico", "Micronesia", "Moldova",
   "Monaco", "Mongolia", "Montserrat", "Morocco", "Mozambique",
   "Myanmar", "Namibia", "Nauru", "Nepal", "Netherlands",
   "Netherlands Antilles", "New Caledonia", "New Zealand",
   "Nicaragua", "Niger", "Nigeria", "Niue", "Norfolk Island",
   "North Korea", "Northern Marianas", "Norway", "Oman", "Pakistan",
   "Palau", "Panama", "Papua New Guinea", "Paraguay", "Peru",
   "Philippines", "Pitcairn Islands", "Poland", "Portugal",
   "Puerto Rico", "Qatar", "Reunion", "Romania", "Russia", "Rwanda",
   "Sqo Tome and Principe", "Saint Helena", "Saint Kitts and Nevis",
   "Saint Lucia", "Saint Pierre and Miquelon",
   "Saint Vincent and the Grenadines", "Samoa", "San Marino",
   "Saudi Arabia", "Senegal", "Seychelles", "Sierra Leone",
   "Singapore", "Slovakia", "Slovenia", "Solomon Islands",
   "Somalia", "South Africa",
   "South Georgia and the South Sandwich Islands", "South Korea",
   "Spain", "Sri Lanka", "Sudan", "Suriname",
   "Svalbard and Jan Mayen", "Swaziland", "Sweden", "Switzerland",
   "Syria", "Taiwan", "Tajikistan", "Tanzania", "Thailand",
   "The Bahamas", "The Gambia", "Togo", "Tokelau", "Tonga",
   "Trinidad and Tobago", "Tunisia", "Turkey", "Turkmenistan",
   "Turks and Caicos Islands", "Tuvalu", "Virgin Islands", "Uganda",
   "Ukraine", "United Arab Emirates", "United Kingdom",
   "United States", "United States Minor Outlying Islands",
   "Uruguay", "Uzbekistan", "Vanuatu", "Vatican City", "Venezuela",
   "Vietnam", "Wallis and Futuna", "Western Sahara", "Yemen",
   "Yugoslavia", "Zambia", "Zimbabwe" };
}

在view文件夹下创建一个CountryView.java

public class CountryView extends LinearLayout implements Checkable {

 private TextView mTitle;
 private CheckBox mCheckBox;

 public CountryView(Context context) {
  this(context, null);
 }

 public CountryView(Context context, AttributeSet attrs) {
  super(context, attrs);
  LayoutInflater inflater = LayoutInflater.from(context);
  View v = inflater.inflate(R.layout.country_view, this, true);
  mTitle = (TextView) v.findViewById(R.id.country_view_title);
  mCheckBox = (CheckBox) v.findViewById(R.id.country_view_checkbox);
 }

 public void setTitle(String title) {
  mTitle.setText(title);
 }

 @Override
 public boolean isChecked() {
  return mCheckBox.isChecked();
 }

 @Override
 public void setChecked(boolean checked) {
  mCheckBox.setChecked(checked);
 }

 @Override
 public void toggle() {
  mCheckBox.toggle();
 }

}

在adapter文件夹下 CountryAdapter

public class CountryAdapter extends ArrayAdapter<Country> {

 public CountryAdapter(Context context, int textViewResourceId,
   List<Country> objects) {
  super(context, textViewResourceId, objects);
 }

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  if ( convertView == null ) {
   convertView = new CountryView(getContext());
  }

  Country country = getItem(position);

  CountryView countryView = (CountryView) convertView;
  countryView.setTitle(country.getName());

  return convertView;
 }
}

在model文件夹下Country.java

public class Country {
 private String name;

 public Country() {

 }

 public String getName() {
  return name;
 }

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

}

主界面

public class Hack30Activity extends Activity {
  private ListView mListView;
  private CountryAdapter mAdapter;
  private List<Country> mCountries;
  private String mToastFmt;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_hack30);
    createCountriesList();
    mToastFmt = getString(R.string.activity_main_toast_fmt);
    mAdapter = new CountryAdapter(this, -1, mCountries);
    mListView = (ListView) findViewById(R.id.activity_main_list);
    mListView.setAdapter(mAdapter);
  }

  public void onPickCountryClick(View v) {
    int pos = mListView.getCheckedItemPosition();

    if (ListView.INVALID_POSITION != pos) {
      String msg = String.format(mToastFmt, mCountries.get(pos)
          .getName());
      Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }
  }

  private void createCountriesList() {
    mCountries = new ArrayList<Country>(Countries.COUNTRIES.length);
    for (int i = 0; i < Countries.COUNTRIES.length; i++) {
      Country country = new Country();
      country.setName(Countries.COUNTRIES[i]);
      mCountries.add(country);
    }
  }
}

country_view.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:orientation="horizontal" >

  <TextView
    android:id="@+id/country_view_title"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="0.9"
    android:padding="10dp" />

  <CheckBox
    android:id="@+id/country_view_checkbox"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="0.1"
    android:clickable="false"
    android:focusable="false"
    android:focusableInTouchMode="false"
    android:gravity="center_vertical"
    android:padding="10dp" />

</LinearLayout>

activity_hack30.xml

<?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:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical" >

  <Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:onClick="onPickCountryClick"
    android:text="@string/activity_main_add_selection" />

  <ListView
    android:id="@+id/activity_main_list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:choiceMode="singleChoice" />

</LinearLayout>

<string name="activity_main_toast_fmt">Chosen country: %s</string>
  <string name="activity_main_add_selection">Pick Country</string>

以上这篇详谈Android ListView的选择模式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Android6.0来电号码与电话薄联系人进行匹配

    Android6.0来电号码与电话薄联系人进行匹配

    这篇文章主要为大家详细介绍了Android6.0来电号码与电话薄联系人进行匹配的方法,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • Android控制闪光灯的方法(打开与关闭)

    Android控制闪光灯的方法(打开与关闭)

    这篇文章主要介绍了Android控制闪光灯的方法,可实现闪光灯打开与关闭的效果,涉及Android操作Camera拍照闪光灯的相关技巧,需要的朋友可以参考下
    2016-01-01
  • android 微信 sdk api调用不成功解决方案

    android 微信 sdk api调用不成功解决方案

    最近一直在调用微信的API,却发现一直调用不成功,纠结了好久,各方面找教程,现在晒出来和大家分享一下
    2012-11-11
  • Android三种实现定时器的方法

    Android三种实现定时器的方法

    本文给大家分享了3种Android实现定时器的方法的示例,,需要的朋友可以参考下
    2015-02-02
  • 详解Android应用main函数的调用

    详解Android应用main函数的调用

    Android常识,App主线程初始化了Looper,调用prepare的地方是ActivityThread.main函数。问题来了,App的main函数在哪儿调用,下面我们来一起学习一下吧
    2019-06-06
  • Android开发之merge结合include优化布局

    Android开发之merge结合include优化布局

    这篇文章主要为大家详细介绍了Android开发之merge结合include优化布局,感兴趣的朋友可以参考一下
    2016-06-06
  • Flutter学习教程之Route跳转以及数据传递

    Flutter学习教程之Route跳转以及数据传递

    这篇文章主要给大家介绍了关于Flutter学习教程之Route跳转以及数据传递的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Flutter具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • android自定义滚轴选择器

    android自定义滚轴选择器

    这篇文章主要为大家详细介绍了android自定义滚轴选择器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Android架构组件Room指南

    Android架构组件Room指南

    Room是Google推出的Android架构组件库中的数据持久化组件库, 也可以说是在SQLite上实现的一套ORM解决方案。下面通过本文给大家介绍Android架构组件Room指南,需要的朋友参考下吧
    2017-12-12
  • Android getViewById和getLayoutInflater().inflate()的详解及比较

    Android getViewById和getLayoutInflater().inflate()的详解及比较

    这篇文章主要介绍了Android getViewById和getLayoutInflater().inflate()的详解及比较的相关资料,这里对这两种方法进行了详细的对比,对于开始学习Android的朋友使用这两种方法是个很好的资料,需要的朋友可以参考下
    2016-11-11

最新评论