Как вы активируете галочки в списке активности? - PullRequest
2 голосов
/ 05 февраля 2010

У меня есть ListActivity с адаптером массива, объявленным как arrayAdapter = new ArrayAdapter<String> (this, android.R.layout.simple_list_item_checked); Это показывает ряд строк с галочками справа. Можете ли вы сказать мне, как получить ссылку на эти галочки или как их отметить / снять галочку?

Ответы [ 3 ]

8 голосов
/ 20 мая 2010

CheckedTextView сам обрабатывает флажок. Он передается как второй аргумент (View v) в обработчике onListItemClick. Таким образом, вы можете упростить ваш код следующим образом:

@Override
protected void onListItemClick( ListView l, View v, int position, long id)
{
  CheckedTextView textView = (CheckedTextView)v;
  textView.setChecked(!textView.isChecked());
}
2 голосов
/ 26 сентября 2011

У меня была похожая проблема, и я попробовал решения, представленные здесь, но у меня все еще было много проблем. Я просто хотел иметь список с выбираемыми «тестовыми случаями» и двумя кнопками «выбрать все тесты» и «запустить выбранные тесты» (поэтому я не хотел иметь только ListActivity). Как упомянуто в «JDC» getChildAt (и getChildCount) ссылаются на отображаемых в данный момент элементов, но мой список не уместился на экране, и поэтому я не мог использовать его для выбора все элементы списка. Кроме того, если я использовал setChecked из CheckedTextView , у меня была проблема, что выбор исчезал, как только я прокручивал список. Мое решение - приведенный ниже код, который устраняет эти проблемы с помощью getCount и setItemChecked из ListView (см. Также комментарии в исходном коде). Кроме того, он показывает, как получить проверенные элементы.

package com.example.test;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.CheckedTextView;
import android.widget.ListView;

public class TestActivity extends Activity {

    static final String[] names = new String[] { "Test 1", "Test 2", "Test 3", "Test 4", "Test 5", "Test 6", "Test 7", "Test 8", "Test 9", "Test 10"};
    ListView list;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Create an ArrayAdapter, that will actually make the Strings above
        // appear in the ListView
        list = (ListView)findViewById(R.id.listOfTests);
        list.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, names));
    }

// This does not work.
// 1st: it checks only the displayed items
// 2nd: as soon as you scroll the list the selections are undone
//
//    public void onRunAllTestsClick (View view) {
//      int count = list.getChildCount();
//      for (int i = 0; i < count; i++)
//          ((CheckedTextView)list.getChildAt(i)).setChecked(true);
//    }

    // This is the solution
    // 1st: getCount deliveres the count of all list items (even if they are not displayed)
    // 2nd: calling setItemChecked on the ListView ensures that the ListView "knows" that the item is checked and does not destroy it if you scroll the list
    public void onRunAllTestsClick (View view) {
        int count = list.getCount();
        for (int i = 0; i < count; i++)
            list.setItemChecked(i, true);
    }

    public void onRunSelectedTestsClick (View view) {
        SparseBooleanArray resultArray = list.getCheckedItemPositions();
        int size = resultArray.size();
        for (int i = 0; i < size; i++)
            if (resultArray.valueAt(i))
                Log.i("CodecTestActivity", list.getAdapter().getItem(resultArray.keyAt(i)).toString());
    }
}

Вот также соответствующий макет (main.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <LinearLayout android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/linearLayout1">
        <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onRunSelectedTestsClick" android:id="@+id/RunSelectedTestsClick" android:text="@string/runselectedtests"></Button>
        <Button android:text="@string/runalltests" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onRunAllTestsClick" android:id="@+id/RunAllTests"></Button>
    </LinearLayout>
    <ListView android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/listOfTests" android:choiceMode="multipleChoice"></ListView>
</LinearLayout>
0 голосов
/ 05 февраля 2010

Самое близкое, что я могу сделать, это изменить галочку после нажатия на ячейку, используя:

@Override
protected void onListItemClick( ListView l, View v, int position, long id)
{
  CheckedTextView textView = (CheckedTextView)l.getChildAt(position);
  text.setChecked(!textView.isChecked());

  super.onListItemClick (l, v, position, id);
}

Я все еще хотел бы иметь возможность устанавливать флажки, не касаясь пользователем каких-либо ячеек.

...