您好,登錄后才能下訂單哦!
怎么在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實現一個選擇模式的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。