Большой набор данных с ArrayAdapter и ListView в Android - PullRequest
6 голосов
/ 13 июня 2011

В учебных целях я хотел бы написать приложение для Android, которое отобразит список чисел от 0 до Integer.MAX_VALUE. У меня сейчас есть Приложение, которое будет отображать цифры от 0 до 100, это легко, потому что вы можете просто создать массив чисел, а затем передать его адаптеру, используя ArrayAdapter. Если я попробую это с очень большим массивом, программа вылетает когда он использует всю доступную память.

Глядя на более сложные приложения, я заметил людей с большими наборами данных используя базы данных и CursorAdapters. Если это правильно, я могу начать читать об этом. Что я хотел бы сделать (хотя не стесняйтесь говорить мне это неверно) это семя моего ArrayAdapter с массивом длиной 100, или некоторые сравнительно небольшая длина Оттуда, как пользователь прокручивает вверх или вниз, я хотел бы изменить значения в массиве (или адаптере), чтобы увеличить как пользователь прокручивает вниз, удаляя самые маленькие элементы в списке и добавляя больше Значения до конца списка. Если пользователь прокручивает вверх, я хотел бы удалить элементы из конца списка и добавление новых меньших значений в начало.

Как я уже говорил для этого проекта, я пока очень мало сделал.

package example.VariableListView;

import java.util.ArrayList;

import android.app.ListActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;

public class variablelistview extends ListActivity {    
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);

            ArrayList<Integer> intItems = new ArrayList<Integer>();
            for (int ii = 0; ii < 100; ii++) {
                    intItems.add(ii);
            }
        this.setListAdapter(new ArrayAdapter<Integer>(this,
                            android.R.layout.simple_list_item_1, intItems));
    }

}

Заранее благодарим за любую помощь.

Ответы [ 2 ]

8 голосов
/ 13 июня 2011

Тип используемого вами адаптера должен зависеть от типа данных, которые вы пытаетесь представить. В идеале адаптеры - это очень тонкий объект, который связывает элементы из вашего набора данных в представления. ArrayAdapter обеспечивает это для небольших ограниченных наборов данных, CursorAdapter обеспечивает это для наборов данных, являющихся результатом запроса SQLite.

Не все наборы данных будут соответствовать формам, представленным предоставляемыми классами Adapter в платформе Android, но написать свой собственный легко. Представление списка всех положительных целых чисел является хорошим примером, потому что это вообще не должно включать взаимодействие с базовой моделью данных. Хотя поддержание скользящего окна в большом наборе данных может быть полезным подходом для некоторых данных, в этом нет необходимости.

Начиная с BaseAdapter:

public class IntRangeAdapter extends BaseAdapter {
    private LayoutInflater mInflater;
    private int mItemResource;

    public IntRangeAdapter(Context context, int itemLayout) {
        // We'll use this to generate new item layouts
        mInflater = LayoutInflater.from(context);

        // This is the layout resource we'll use for each item
        mItemResource = itemLayout;
    }

    public int getCount() {
        // Since this adapter presents all positive integers,
        // we have Integer.MAX_VALUE items.
        return Integer.MAX_VALUE;
    }

    public Object getItem(int position) {
        // Each item is simply its position index.
        return position;
    }

    public long getItemId(int position) {
        // Our items won't change and we don't need stable IDs,
        // so the position of an item is also its ID.
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            // Inflate a new item layout if we weren't given an existing
            // one to reuse via the convertView parameter.
            convertView = mInflater.inflate(mItemResource, parent, false);
        }

        // Find the TextView where we will label the item.
        // (This can be optimized a bit for more complex layouts
        // but we won't bother for this example.)
        TextView tv = (TextView) convertView.findViewById(android.R.id.text1);

        // Set the item text based on its position.
        tv.setText("Item " + position);

        return convertView;
    }
}

Использование его из вашего опубликованного кода активности будет тогда означать изменение вашего setAdapter вызова и удаление цикла для настройки данных:

this.setListAdapter(new IntRangeAdapter(this,
        android.R.layout.simple_list_item_1));

Если вам нужна дополнительная информация об использовании ListViews, этот доклад из Google I / O 2010 дает хорошее представление: http://www.youtube.com/watch?v=wDBM6wVEO70

1 голос
/ 13 июня 2011

Вероятно, самое простое решение - реализовать собственную Adapter (http://developer.android.com/reference/android/widget/Adapter.html)) вместо попытки заставить CursorAdapter или ArrayAdapter сделать что-то, для чего он не предназначен.

Методы должны быть очень просты в реализации. Например:

int getCount() => Integer.MAX_VALUE
Object getItem(int position) => position
...