Программная прокрутка к элементу в ListView при использовании CustomListViewAdapter

Я пытаюсь программно выполнить прокрутку до определенной позиции в представлении списка при использовании CustomListViewAdapter.

Я использую customlistviewadapter, потому что всякий раз, когда щелкают по элементу в списке, он «открывается» для отображения некоторого текста. Именно в этот момент я хочу программно выполнить прокрутку до верхней части только что отображаемого текста.

В настоящее время все работает нормально, ЗА ИСКЛЮЧЕНИЕМ того, что я не знаю, как вызвать функцию:

listview.setSelection(currentPosition);

Кажется, я не могу добраться до него в CustomListViewAdapter, где я прослушиваю событие щелчка в элементе listview.

Я пробовал вызвать:

parent.setSelected(true);

Сразу после щелчка по элементу и функции

notifyDataSetChanged();

вызывается, но ничего не делает.

Как я могу вызвать

listview.setSelection(currentPosition);

или даже лучше:

listview.smoothScrollToPositionFromTop(position,offset,duration);

В классе CustomListViewAdapter?

Ниже приведен код CustomListViewAdapter.

public class CustomListViewAdapter extends ArrayAdapter<RowItem> {

Context context;
ArrayList<RowItem> _rowItems;
RowItem item;
View row;
TextView ReferenceGospel;

  public CustomListViewAdapter(Context context, int resourceId,
                             ArrayList<RowItem> rowItems) {


    super(context, resourceId, rowItems);
    this.context = context;
    _rowItems = rowItems;
}

@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
row = convertView;
item = _rowItems.get(position);

 if (row == null) {
        LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row = mInflater.inflate(R.layout.book_list, parent, false);
        row.setTag(thisPosition);

    }

ReferenceGospel = (TextView) row.findViewById(R.id.gospelRef);

// ... some other code here

ReferenceGospel.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            item = _rowItems.get(position);
            CustomListViewAdapter.this.notifyDataSetChanged();
  }
     });
    return row;
}

Я просмотрел несколько сообщений, но ничего не помогло. Спасибо.

"он" открывается "для отображения текста". вы можете объяснить больше? как текст отображается в отдельном диалоге в самом элементе списка?

Sahil 12.08.2018 19:02

Извините за непонятность. Открывая его, я имею в виду, что элемент списка становится видимым ... я не включил код, который это делает. Так что это сам элемент списка.

user3079872 12.08.2018 19:06

@Sahil, приложение доступно для загрузки, где вы можете ясно понять, что я имею в виду, отображая некоторый текст. Если это поможет, я могу отправить вам ссылку на приложение. Спасибо!

user3079872 12.08.2018 19:12
0
3
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Передайте список в конструкторе адаптера:

ListView listView;

  public CustomListViewAdapter(Context context, ListView listView,
                         ArrayList<RowItem> rowItems) {


 super(context, resourceId, rowItems);
 this.context = context;
 this.listView = listView;
 _rowItems = rowItems;

}

тогда вы можете вызвать listview.smoothScrollToPositionFromTop(position,offset,duration); из метода getView.

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

Спасибо. Это помогает. Конечно, все, что мне нужно было сделать, это передать список в адаптер. Отлично, спасибо за помощь, работает отлично!

user3079872 12.08.2018 19:26

Другие вопросы по теме