Как сделать так, чтобы 1-й элемент фокусировался в ListView по умолчанию при входе на экран просмотра списка?

В моем представлении списка я должен сделать 1-й элемент для фокусировки. В моем приложении я реализовал D-PAD. Если я нашел начальный фокус, я буду перемещаться по фокусу с помощью D-PAD. я пробовал с setSelection(position) этот код не работает.

Я обнаружил какое-то странное поведение listview, по умолчанию он всегда фокусируется на -1 позиции. Я не знаю, почему? Пожалуйста, объясните это поведение.

Мои элементы представления списка загружаются с сервера. Итак, когда мне нужно сделать setSelection() и как проверить завершение задачи setAdpter?

@Override
    public final View getView(final int position, final View convertView, final ViewGroup parent) {
        final LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        final View rowView = inflater.inflate(R.layout.list_item_faq, parent,
                false);
        final TextView textView = (TextView) rowView
                .findViewById(R.id.faqlist_text);
        textView.setText("text");
        textView.setMaxLines(2);
        textView.setEllipsize(android.text.TextUtils.TruncateAt.END);
        return rowView;
    }

адаптер.xml

 <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/sel_list_item" //this is selector
        android:gravity="center_vertical"
        android:orientation="horizontal" >

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingLeft="8dp"
            android:layout_margin="2dp"
            android:layout_gravity="center"
            android:src="@drawable/cc_question_mark" />

        <TextView
            android:id="@+id/faqlist_text"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_marginLeft="20dp"
            android:gravity="center_vertical"
            android:textColor="#6f6f6f"
            android:textSize="22sp" />
</LinearLayout>

Пожалуйста, предложите любую идею, чтобы сделать 1-й пункт Фокус.


person Boopathi    schedule 20.01.2015    source источник
comment
под 1-м элементом вы подразумеваете 1-ю строку в списке?   -  person user2511882    schedule 30.01.2015


Ответы (9)


Ваш yourListView focusable?

Do in onResume()

    yourListView.postDelayed(new Runnable() {
    @Override
    public void run() {
        yourListView.setSelection(0);
        yourListView.getChildAt(0).requestFocus()
    }
}, 500);
person Aown Raza    schedule 30.01.2015

Попробуйте сделать следующее:

public void onStart() {
    super.onStart();
    onListItemClick(listView, findViewById(android.R.id.content), 1, 0);
}

public void setActivateOnItemClick(boolean activateOnItemClick) {
    listView.setChoiceMode(activateOnItemClick ? ListView.CHOICE_MODE_SINGLE
            : ListView.CHOICE_MODE_NONE);
}
person Abubakr Dar    schedule 30.01.2015
comment
мой код не наследует активность списка, он просто с активностью - person learner; 30.01.2015

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

listView.postDelayed(new Runnable() {
    @Override
    public void run() {
        listView.setSelection(0);
    }
}, 500);
person Shivam Verma    schedule 23.01.2015
comment
Куда вы положили задержку? В onResume? - person Shivam Verma; 23.01.2015
comment
Можете ли вы добавить еще код активности? Если не работает, значит проблема в другом. - person Shivam Verma; 23.01.2015
comment
Вопрос был обновлен, пожалуйста, обновите ответ на основе этого. - person learner; 29.01.2015
comment
Как вы загружаете данные с сервера? Вы используете AsyncTask? - person Shivam Verma; 29.01.2015

Попробуй это

listView.getAdapter().getView(position, null, null).performClick();

person Anamika    schedule 29.01.2015

если вы уже пробовали list.setSelection(position), попробуйте

list.setItemChecked(0, true);

Я надеюсь, что это работает для вас. но помните, обновите это в основном потоке или потоке пользовательского интерфейса

ОБНОВЛЕНИЕ

также попробуйте это

list.setFocusable(true);
list.requestFocus();

ОБНОВЛЕНИЕ 1

Когда вы получите весь список из данных, вызовите

adapter.notifyDataSetChanged();
list.setSelection(position);
person Lokesh    schedule 28.01.2015
comment
пробовал с setItemChecked(0,true); ,это не работает. - person learner; 28.01.2015
comment
list.setFocusable (истина); список.requestFocus(); и list.setFocusableInTouchMode(true); список.requestFocus(); попробуй, не работает - person learner; 28.01.2015
comment
то, что вы пытаетесь сделать ... может быть, это можно сделать по-другому, поэтому объясните немного больше - person Lokesh; 28.01.2015
comment
например, у меня есть два экрана, 1-й экран имеет одну кнопку, а второй экран - это просмотр списка. Нажав кнопку 1-го экрана, я перейду к просмотру списка оттуда, я должен сфокусировать 1-й элемент - person learner; 28.01.2015
comment
android:background=?android:activatedBackgroundIndicator, установленный в макете списка элементов, затем попробуйте list.setItemChecked(0, true); - person Lokesh; 28.01.2015
comment
Вопрос был обновлен, пожалуйста, обновите ответ на основе этого. - person learner; 29.01.2015
comment
Давайте продолжим обсуждение в чате. - person learner; 29.01.2015

Не могли бы вы показать мне метод getview кода в адаптере? Я думаю, вы установили статический видоискатель в адаптере. Вы должны удалить if(convertView == null) условие. Выглядит как:

        // if (convertView == null) {

        holder = new ViewHolder();
        convertView = mInflater.inflate(
                R.layout.baseadapter_dropdown_layout, null);
        holder.img = (ImageView) convertView.findViewById(R.id.imageView1);
        convertView.setTag(R.layout.baseadapter_dropdown_layout, holder);

        // } else {
        // holder = (ViewHolder) convertView
        // .getTag(R.layout.baseadapter_dropdown_layout);
        // }
person Duc Nguyen    schedule 30.01.2015
comment
Можете ли вы удалить android:background="@drawable/sel_list_item" и заменить на: listview.setSelector(getWallpaper()); listview.setSelection(0); в действии. - person Duc Nguyen; 30.01.2015
comment
Если вы выберете строку в списке, обои вашего телефона установят фон для селектора. вы будете знать, какая строка была выбрана. - person Duc Nguyen; 30.01.2015
comment
Вы хотите выделить выбранный элемент? или Вы хотите сфокусировать просмотр на выбранном элементе? Вы пытаетесь stackoverflow.com/ вопросы/13657136/ ? - person Duc Nguyen; 30.01.2015

В onResume() выберите

mListView.setSelection(position);

or

mListView.setSelection(listview.getAdapter().getCount()-1);

также

mListView.requestFocus();

также попробуйте управлять нулевой проверкой перед вводом жестко закодированных позиций.

person Detoxic Spirit    schedule 30.01.2015

Используйте выполнениеItemClick. Он вызовет OnItemClickListener, если он определен. Это работает в обаянии для меня.

int setPosition = 0; // Your default position. Any value less than your list size.
int ignoreId = 0; // We ignore the row id of the item that was clicked.
yourListView.setItemChecked(setPosition, true);
yourListView.performItemClick(yourListView.getSelectedView(), setPosition,   ignoreId);
person Sibin John Mattappallil    schedule 18.08.2016

Нет необходимости использовать сообщение с просмотром списка, вы можете просто использовать listView.setSelection(0) после добавления данных в список

person Aman Singhal    schedule 23.01.2015
comment
я также использовал setselection, если я даю setSelection (10), этот 10-й элемент будет первым элементом экрана, но фокус не произойдет. - person Boopathi; 23.01.2015
comment
я упомянул, что setselection не работает так, поэтому мне нужен другой способ - person learner; 23.01.2015