詳談Android ListView的選擇模式
效果圖:
ListView 定義了choiceMode屬性,描述是這樣的:
用于為視圖定義選擇行為。默認(rèn)情況下,列表時(shí)沒有任何選擇行為的。如果把choiceMode設(shè)置為singleChoice,列表允許有一個(gè)列表項(xiàng)處于被選狀態(tài)。如果把choiceMode設(shè)置為multipleChoice,那么列表允許有任意數(shù)量的列表項(xiàng)處于被選狀態(tài)
ListView以某種方式通過Checkable接口處理視圖的選擇狀態(tài),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處理選擇行為,需要令列表項(xiàng)對(duì)應(yīng)的自定義視圖實(shí)現(xiàn)Checkable接口,這個(gè)需要自定義
創(chuàng)建一個(gè)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文件夾下創(chuàng)建一個(gè)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的選擇模式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Flutter Android應(yīng)用啟動(dòng)白屏的解決方案
任何一個(gè)app基本都會(huì)設(shè)計(jì)一個(gè)啟動(dòng)頁,今天我們就來看看怎么在flutter項(xiàng)目中設(shè)置啟動(dòng)頁,這篇文章主要給大家介紹了關(guān)于Flutter Android應(yīng)用啟動(dòng)白屏解決的相關(guān)資料,需要的朋友可以參考下2021-11-11解決Android應(yīng)用冷啟動(dòng)時(shí)出現(xiàn)的白屏問題的方法
本篇文章主要介紹了解決Android應(yīng)用冷啟動(dòng)時(shí)出現(xiàn)的白屏問題的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08Android關(guān)于BottomNavigationView使用指南
本文主要介紹了Android關(guān)于BottomNavigationView使用指南,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01使用SurfaceView實(shí)現(xiàn)視頻彈幕
這篇文章主要為大家詳細(xì)介紹了使用SurfaceView實(shí)現(xiàn)視頻彈幕,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11Android開發(fā)使用PopupMenu創(chuàng)建彈出式菜單完整實(shí)例
這篇文章主要介紹了Android開發(fā)使用PopupMenu創(chuàng)建彈出式菜單,結(jié)合完整實(shí)例形式分析了Android基于PopupMenu對(duì)象創(chuàng)建的彈出式菜單相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-03-03Android ViewPager實(shí)現(xiàn)左右滑動(dòng)的實(shí)例
這篇文章主要介紹了Android ViewPager實(shí)現(xiàn)左右滑動(dòng)的實(shí)例的相關(guān)資料,這里提供實(shí)現(xiàn)代碼實(shí)現(xiàn)左右滑動(dòng)的功能,希望能幫助到大家,需要的朋友可以參考下2017-08-08Android DynamicGrid實(shí)現(xiàn)拖曳交換位置功能
這篇文章主要為大家詳細(xì)介紹了Android DynamicGrid實(shí)現(xiàn)拖曳交換位置功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06