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

Android: Можно ли обновить только один элемент в списке?

Мне интересно, можно ли переименовать только один элемент в списке? Предполагаю, позвонив notifyDatasetChanged(), вы переиздаете весь список?

Спасибо,

4b9b3361

Ответ 1

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

Намного проще просто вызвать notifyDatasetChanged().

Ответ 2

вы не можете сделать (обновить) одну строку, но вместо этого вы можете получить запрошенное представление и сделать chages на нем напрямую, вызвав yourListView.getChildAt(int VisiblePosition);, где visiblePostion - это позиция в ListView минус yourListView.getFirstVisiblePosition()

Вот так:

    View v = listViewItems.getChildAt(position - 
            listViewItems.getFirstVisiblePosition());
    v.setBackgroundColor(Color.GREEN);

Надеюсь, это поможет...

Ответ 3

Также вы можете использовать это:

myListView.invalidateViews();

Ответ 4

dataAdapter.remove(dataAdapter.getItem(clickedpos));

dataAdapter.insert(t.getText().toString(), clickedpos);

Ответ 5

Вот как я это сделал:

Ваши элементы (строки) должны иметь уникальные идентификаторы, чтобы впоследствии их можно обновлять. Установите метку каждого вида, когда список получает представление от адаптера. (Вы также можете использовать ключевой тег, если тег по умолчанию используется где-то еще)

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    View view = super.getView(position, convertView, parent);
    view.setTag(getItemId(position));
    return view;
}

Для обновления проверьте каждый элемент списка, если вид с данным идентификатором есть там, и он должен быть обновлен.

private void update(long id)
{

    int c = list.getChildCount();
    for (int i = 0; i < c; i++)
    {
        View view = list.getChildAt(i);
        if ((Long)view.getTag() == id)
        {
            // update view
        }
    }
}

Это на самом деле проще, чем другие методы и лучше, когда вы имеете дело с идентификаторами не позиций! Также вы должны учитывать сценарий, когда ваше представление становится невидимым и видимым снова.

Ответ 6

Вам нужно отслеживать свой адаптер (или настраиваемый адаптер, если вы настроены на привлекательные функции). Когда вы меняете данные для элемента, просто измените интересующие вас поля в своем адаптере. Затем вызовите notifyDatasetChanged, и изменения будут отражены в вашем списке.

Обратите внимание, что этот подход работает точно так же и для Галереи.