Подтвердить что ты не робот

NotifyDataSetChanged() делает обновление списка и прокручивает подсказки назад

Я пытаюсь реализовать бесконечный список прокрутки, но когда я вызываю notifyDataSetChanged(), весь список обновляется, тогда позиция прокрутки возвращается к началу.

Это обычное поведение? как я могу сделать это, просто добавьте добавленные элементы без обновления и сохраните положение прокрутки?

4b9b3361

Ответ 1

Такое поведение ненормально. Не видя кода, я могу предложить следующее:

1) Вы не вызываете notifyDataSetChanged() из потока пользовательского интерфейса. Правильный способ:

runOnUiThread(new Runnable() {
    public void run() {
        adapter.notifyDataSetChanged();
    }
});

2) Вы случайно или не звоните adapter.notifyDataSetInvalidated();

3) В вашем адаптере вы переопределите метод adapter.notifyDataSetChanged(); и добавили инструкцию, чтобы перейти в начало

4) Если вы используете список для заполнения адаптера - каждый раз вы добавляете новый список, так что настройки адаптера обновляются. Вы всегда должны указывать тот же список. Однако вы можете изменить его столько, сколько хотите. Если вы сбросите список, используйте list.clear вместо list = new ArrayList();

Вот пример моего адаптера:

public class Adapter extends BaseAdapter {

    private Activity activity;
    private ArrayList<HashMap<String, String>> data;
    private static LayoutInflater inflater = null;
    public ImageLoader imageLoader;

    public MediaItemAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
        activity = a;
        data = d;
        inflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        imageLoader = new ImageLoader(activity.getApplicationContext());
    }

    public int getCount() {
        return data.size();
    }

    public Object getItem(int position) {
        return position;
    }

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

    public View getView(int position, View convertView, ViewGroup parent) {
        View vi = convertView;
        if (convertView == null) {
            vi = inflater.inflate(R.layout.item_composer, null);
        }
        TextView title = (TextView) vi.findViewById(R.id.item_title); // title
        TextView price = (TextView) vi.findViewById(R.id.price);


        return vi;
    }


}

Вызовите адаптер:

List myList = new ArrayList<HashMap<String, String>>();
Adapter ma = new Adapter(this, myList);

myList может быть пуст до инициализации адаптера.

Затем выполните некоторую операцию с моим списком:

myList.add(someElement);
ma.notifyDataSetChanged();

если вам нужно удалить все элементы:

myList.clear();
ma.notifyDataSetChanged();

Такая реализация довольно бесконечна, я видел более 15 тысяч элементов без каких-либо проблем.

Ответ 2

Вы можете сделать это по-другому, например

int position = scrollView.getSelectedItemPosition();
notifyDataSetChanged();
scrollView.setSelection(position);

Ответ 3

В моем случае проблема заключалась в том, что я вызывал ListView.setAdapter(adapter) каждый раз, когда были установлены новые данные, а также позиция reset и представление переместилось вверх.

Удаление избыточных вызовов setAdapter(...) исправлено для меня.

Ответ 4

Если ваш адаптер является подклассом ArrayList, то вызов adapter.clear() вызывает notifyDataSetChanged(), в результате чего позиция прокрутки будет потеряна. Сначала вызовите setNotifyOnChange(false), чтобы предотвратить это.

Дополнительная информация здесь: fooobar.com/info/260933/...