Tổng quan về ListView Multiple Selection và ListView Single Selection
ListView Multiple Selection là ListView
cho phép được chọn nhiều item và áp dụng cho hành động vào những item này. Ví dụ như xoá những số trong danh bạ, xóa nhiều tin nhắn, ...
ListView Single Selection là ListView
cho phép chọn duy nhất 1 item và sử dụng trong trường hợp chỉ cho phép chọn 1 item.
Tạo project ListViewMultipleAndSingleSelection gồm 3 Activity là:
ListViewMultipleSelectionActivity
: xử lý ListView Multiple Selection.ListViewSingleSelectionActivity
: xử lý ListView Single Selection.MainActivity
: chứa 2 button để chuyển hướng qua 2 Activity trên.
ListView Multiple Selection
File activity_list_view_multiple_selection.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="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.eitguide.nguyennghia.listviewmultipleandsinglechoice.ListViewMultipleSelectionActivity">
<CheckBox
android:id="@+id/cb_check_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Check All" />
<ListView
android:id="@+id/lv_multiple_selection"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<Button
android:id="@+id/btn_get_item_selected"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Get Item Selected" />
</LinearLayout>
Checkbox
có nhiệm vụ kiểm tra hết các item có trongListView
.Button
sẽ lấy ra thông tin của các lựa chọn.
File ListViewMultipleSelectionActivity.java
package com.eitguide.nguyennghia.listviewmultipleandsinglechoice;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class ListViewMultipleSelectionActivity extends AppCompatActivity {
private static final String TAG = "ListViewMultiple";
private ListView lvMultipleSelection;
private Button btnGetItemsChecked;
private CheckBox cbCheckAll;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view_multiple_selection);
lvMultipleSelection = (ListView) findViewById(R.id.lv_multiple_selection);
btnGetItemsChecked = (Button) findViewById(R.id.btn_get_item_selected);
cbCheckAll = (CheckBox) findViewById(R.id.cb_check_all);
final List<String> data = new ArrayList<>();
for (int i = 0; i < 100; i++)
data.add("Item " + i);
final ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_multiple_choice, data);
lvMultipleSelection.setAdapter(adapter);
lvMultipleSelection.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
btnGetItemsChecked.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SparseBooleanArray sparseBooleanArray = lvMultipleSelection.getCheckedItemPositions();
String itemsSelected = "";
Log.e(TAG, "Total Number Selected: " + lvMultipleSelection.getCheckedItemCount());
for (int i = 0; i < sparseBooleanArray.size(); i++) {
int position = sparseBooleanArray.keyAt(i);
itemsSelected += "item " + position + ",";
}
Toast.makeText(ListViewMultipleSelectionActivity.this, itemsSelected, Toast.LENGTH_SHORT).show();
}
});
cbCheckAll.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Log.e(TAG, "onCheckedChanged: " + isChecked);
for (int i = 0; i < adapter.getCount(); i++)
lvMultipleSelection.setItemChecked(i, isChecked);
}
});
}
}
Tạo Adapter cho ListView Multiple Selection
Layout resource truyền vào là layout đã được định nghĩa trong hệ thống android.R.layout.simple_list_item_multiple_choice.xml
File XML này có mã như sau:
<?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/listPreferredItemHeightSmall"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:gravity="center_vertical"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" />
1 dòng trong ListView
này là 1 CheckedTextView
. Phải setChoiceMode
cho ListView
như sau:
lvMultipleSelection.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
Lấy các item đã chọn trong ListView
Lấy thông tin các item đã chọn, trên ListView
bằng cách sử dụng:
SparseBooleanArray sparseBooleanArray = lvMultipleSelection.getCheckedItemPositions();
Phương thức này trả về 1 SparseBooleanArray
chứa key, là vị trí của những item đã chọn và giá trị sẽ là true
.
Phương thức lấy ra những item đã chọn trong ListView
như sau:
btnGetItemsChecked.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SparseBooleanArray sparseBooleanArray = lvMultipleSelection.getCheckedItemPositions();
String itemsSelected = "";
Log.e(TAG, "Total Number Selected: " + lvMultipleSelection.getCheckedItemCount());
for (int i = 0; i < sparseBooleanArray.size(); i++) {
int position = sparseBooleanArray.keyAt(i);
if (sparseBooleanArray.get(position))
itemsSelected += "item " + i + ",";
Toast.makeText(ListViewMultipleSelectionActivity.this, itemsSelected, Toast.LENGTH_SHORT).show();
}
});
Ngoài ra có thể lấy tổng số item đã chọn bằng:
lvMultipleSelection.getCheckedItemCount()
Kiểm tra và không kiểm tra tất cả item có trong ListView
Sử dụng phương thức setItemChecked(position, value)
để kiểm tra 1 item trên ListView
:
lvMultipleSelection.setItemChecked(i, isChecked);
Để kiểm tra tất cả các item phải duyệt qua tất các các phần tử có trong adapter và sử dụng phương thức trên để setItemChecked()
cho từng item.
cbCheckAll.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Log.e(TAG, "onCheckedChanged: " + isChecked);
for (int i = 0; i < adapter.getCount(); i++)
lvMultipleSelection.setItemChecked(i, isChecked);
}
});
ListView Single Selection
File activity_list_view_single_seletion.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="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.eitguide.nguyennghia.listviewmultipleandsinglechoice.ListViewSingleSeletionActivity">
<ListView
android:id="@+id/lv_single_selection"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<Button
android:id="@+id/btn_get_item_selected"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Get Item Selected" />
</LinearLayout>
File ListViewSingleSelectionActivity.java
package com.eitguide.nguyennghia.listviewmultipleandsinglechoice;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class ListViewSingleSeletionActivity extends AppCompatActivity {
private static final String TAG = "SingleSeletion";
private ListView lvSingleSelection;
private Button btnGetItemSelected;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view_single_seletion);
lvSingleSelection = (ListView) findViewById(R.id.lv_single_selection);
btnGetItemSelected = (Button) findViewById(R.id.btn_get_item_selected);
List<String> data = new ArrayList<>();
for (int i = 0; i < 100; i++)
data.add("Item " + i);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_single_choice, data);
lvSingleSelection.setAdapter(adapter);
lvSingleSelection.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
btnGetItemSelected.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(ListViewSingleSeletionActivity.this, "Item Selected: " + lvSingleSelection.getCheckedItemPosition(), Toast.LENGTH_SHORT).show();
}
});
}
}
Tạo Adapter cho ListView Single Selection
Nguồn layout phải truyền là của hệ thống android.R.layout.simple_list_item_single_choice:
<?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/listPreferredItemHeightSmall"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:gravity="center_vertical"
android:checkMark="?android:attr/listChoiceIndicatorSingle"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" />
Sau đó setChoiceMode
cho ListView
bằng phương thức:
lvSingleSelection.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
Lấy item đã chọn
Để lấy item đã chọn, sử dụng phương thức getCheckedItemPosition()
của ListView
:
lvSingleSelection.getCheckedItemPosition()
Phương thức này trả về vị trí của item đã chọn, cũng có thể kiểm tra 1 item sử dụng phương thức setCheckedItem()
, giống trường hợp sử dụng ListView Multiple Selection.
Tải source code của bài viết:
- Tải trực tiếp: ListViewMultipleAndSingleSelection-master.zip.
- Tải từ Github.