Android 当进入列表视图屏幕时,如何在默认情况下使列表视图中的第一项成为焦点?

Android 当进入列表视图屏幕时,如何在默认情况下使列表视图中的第一项成为焦点?,android,android-listview,android-drawable,android-selector,Android,Android Listview,Android Drawable,Android Selector,在我的列表视图中,我必须使第一个项目成为焦点。在我的应用程序中,我已经完成了D-PAD实现,如果我找到了初始焦点,我将使用D-PAD导航焦点。 我尝试使用setSelection(position)此代码无效 我发现listview有一些奇怪的行为,默认情况下它总是聚焦-1位置。我不知道为什么?请澄清这种行为 我的列表视图项是从服务器获取加载。所以,当我必须进行setSelection()时,如何检查setAdpter任务是否完成 @Override public final View

在我的列表视图中,我必须使第一个项目成为焦点。在我的应用程序中,我已经完成了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;
    }
adapter.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>


请提出任何使第一项成为焦点的想法。

在使用集合选择之前,您可能需要稍微延迟一点时间

listView.postDelayed(new Runnable() {
    @Override
    public void run() {
        listView.setSelection(0);
    }
}, 500);

无需将post与listview一起使用。将数据添加到列表中后,您只需使用
listview.setSelection(0)
,如果您已尝试
list.setSelection(position)
,请尝试

list.setItemChecked(0, true);
我希望它对你有用。但请记住,在主线程或ui线程中更新此内容

更新

也试试这个

list.setFocusable(true);
list.requestFocus();
更新1

当您从数据中获取所有列表时,请调用

adapter.notifyDataSetChanged();
list.setSelection(position);
试试这个


getView(位置,null,null).performClick()

您的
列表视图是否可聚焦

onResume()中执行


您能给我看一下适配器中的代码getview方法吗? 我认为您在适配器中设置了静态viewholder。 如果(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);
        // }

尝试执行以下操作:

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);
}
onResume()中

mListView.setSelection(position);


在输入硬编码位置之前,还要尝试管理空检查。

使用performItemClick。如果定义了侦听器,它将调用该侦听器。这对我很有吸引力

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);

我也使用了setselection,如果我给setselection(10),第10项将是屏幕的第一项,但焦点没有发生。我已经提到setselection不是那样工作的,所以,我需要一些其他方法。你把延迟放在哪里了?在onResume中,您可以添加更多的活动代码吗?如果它不起作用,肯定还有其他问题。问题已被更新,请在此基础上更新答案。如何从服务器加载数据?您正在使用AsyncTask吗?已尝试使用setItemChecked(0,true),它不工作。list.setFocusable(true);requestFocus();和list.setFocusableInTouchMode(true);requestFocus();trie,你想做的事情不起作用……也许可以用其他方式来做,所以请再解释一下。例如,我有两个屏幕,第一个屏幕有一个按钮,第二个屏幕是列表视图。单击第一个屏幕按钮将进入列表视图,从那里我必须关注第一个项目android:background=“?android:activatedBackgroundIndicator”在项目列表布局中设置,然后重试列表。setItemChecked(0,true);第一项是指listview中的第一行吗?能否删除
android:background=“@drawable/sel_list_item”
并替换为:
listview.setSelector(getWallpar());listview.setSelection(0)在“活动”中。若选择列表中的行,手机壁纸将为选择器设置背景。您将知道选择了哪一行。是否要突出显示选定的项目?还是希望焦点视图显示选定的项目?你在尝试吗?我的代码没有继承列表活动,它只是带有活动
mListView.setSelection(listview.getAdapter().getCount()-1);
mListView.requestFocus();
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);