Получить все элементы ListView

Рейтинг: 0Ответов: 4Опубликовано: 17.10.2014

Доброго времени суток! Я пытаюсь написать приложение под Android, и у меня возникла следующая проблема. У меня есть ListView, которое заполнено элементами. В каждом элементе есть чекбокс. Я хочу по нажатию кнопки отметить все чекбоксы. Я пытаюсь это сделать так:

ListView list = (ListView)findViewById(R.id.myList);

for(int i = 0; i < list.getCount(); i++) { 
    View view = ((CheckBox)list.getChildAt(i);     
    view.findViewById(R.id.myCheckbox)).setChecked(true);
}

Всего элементов в ListView семь, на экране умещается 4. Так вот, когда i становится больше 3, то при попытке обратиться к list.getChildAt(i) я получаю NullPointerException. Насколько я понимаю, с помощью getChildAt я могу обратиться только к тем элементам, которые видны на экране. А как мне обратиться вообще ко всем элементам в ListView вне зависимости от того, отображается он на экране или нет? Можно ли как-то получить все 'tktvtyns ListView? Заранее спасибо!

Ответы

▲ 3Принят

Зайдем с другой стороны, если у тебя есть чекбоксы, вероятнее всего, у тебя кастомный адаптер, тогда - в нем, на чекбокс повешай листенер, который будет менять состояние объекта, потом на кнопку ВЫДЕЛИТЬ ВСЕ повешай акшн, который пробежится по всем твоим объектам и выставит им флаг выделенной галочки, а потом адаптеру сделать нотифайДатаСетЧендж.

Если все, что написано, непонятно, учи матчасть. =)

▲ 2

Залил на гитхаб: https://github.com/JenyaKirmiza/TestListView

Я сделал по тупому.

Вот кастомный адаптер:

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;

import org.w3c.dom.Text;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.zip.CheckedInputStream;

public class ListAdapter extends BaseAdapter{

ArrayList< Integer> items;
private LayoutInflater inflater = null;
private ViewHolder viewHolder;
private Integer wp;
private Context c;

    public void setSelectedAll() {
        this.isSelectedAll = !isSelectedAll;
    }

    /*--- a simple View Holder class ---*/
static class ViewHolder {
    public CheckBox checkBox;
    public TextView textView;
}
private boolean isSelectedAll=false;

/*--- Context and all weapons of specified class are passed here ---*/

public ListAdapter(ArrayList<Integer> items, Context c) {
    this.items =  items;
    inflater = LayoutInflater.from(c);
    this.c = c;
}

@Override
public int getCount() {
    return items.size();

}

@Override
public Integer getItem(int position) {
    return items.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    /*--- initialize our Weapon Object ---*/
    wp = items.get(position);

    if (convertView == null) {
        /*--- no View is available. Inflate our list item layout and init the Views we need ---*/
        convertView = inflater.inflate(R.layout.list_row, null);
        viewHolder = new ViewHolder();
        viewHolder.checkBox = (CheckBox) convertView
                .findViewById(R.id.checkBox);
        viewHolder.textView = (TextView) convertView
                .findViewById(R.id.textView);
        convertView.setTag(viewHolder);

    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    if (isSelectedAll)
        viewHolder.checkBox.setChecked(true);
    else
        viewHolder.checkBox.setChecked(false);

    viewHolder.textView.setText(wp+"");
    return convertView;
}
   }

Вот в активности:

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class MyActivity extends Activity {
    private ListView listView;
    private ListAdapter listAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        listView=(ListView)findViewById(R.id.listView);
        ArrayList<Integer> arrayList=new ArrayList<Integer>();
        for(int i=0;i<100;i++)
            arrayList.add(i);

        listAdapter=new ListAdapter(arrayList, getApplicationContext());
        listView.setAdapter(listAdapter);

        Button btn=(Button)findViewById(R.id.btnSelectAll);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listAdapter.setSelectedAll();
                listAdapter.notifyDataSetChanged();
            }
        });
    }

}

Это так, по-быстрому. А вообще я бы делал, как Gorets посоветовал. Листенер вешал на чекбокс в getView, а сам listener создавал в кастомном адаптере.

Обрати внимание на использование паттерна ViewHolder. Еще советую все изображения в лист вьюхах грузить в фоне.

▲ 1

Через адаптер их получать надо.

list.getAdapter().getItem(position);
▲ 1

Так их и создаётся ровно столько, сколько помещается на экране. В дальнейшем уже созданные View просто используются повторно.

А то, что вы хотите сделать, реализуется выставлением у ListView нужного режима выбора:

listView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);

С последующим вызовом

listView.setItemChecked(itemPosition, true);

И да, чтобы вся эта магия работала правильно, не забудьте реализовать интерфейс Checkable у View, который представляет собой элемент ListView.