Search…

ListView Multiple Selection và ListView Single Selection

16/11/20208 min read
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, ... cò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ổ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ó trong ListView.
  • 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:

Bài chung series

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024