Android ListView setSelection()似乎不起作用

Android ListView setSelection()似乎不起作用,android,listview,Android,Listview,我有一个ListActivity,它实现了onListItemClick(),并调用类的doSomething()函数。后者包含l.setSelection(position)其中l是ListView对象 现在有一个onClickListener()正在侦听执行某些操作的按钮单击,该按钮也会调用doSomething() 在第一种情况下,所选项目得到了适当的定位,但在后一种情况下,什么也没有发生 关于这种奇怪行为的任何线索以及我可能如何使其工作?setSelection()不一定具有视觉效果。仅

我有一个
ListActivity
,它实现了
onListItemClick()
,并调用类的
doSomething()
函数。后者包含
l.setSelection(position)
其中
l
ListView
对象

现在有一个
onClickListener()
正在侦听执行某些操作的按钮单击,该按钮也会调用
doSomething()

在第一种情况下,所选项目得到了适当的定位,但在后一种情况下,什么也没有发生

关于这种奇怪行为的任何线索以及我可能如何使其工作?

setSelection()
不一定具有视觉效果。仅当使用D-pad/轨迹球在列表中导航时,选择栏才会出现。如果点击屏幕上的某个内容,选择栏会短暂出现并消失

因此,
setSelection()
只有在活动未处于触摸模式时才会产生视觉影响(即,用户最后做的事情是使用D-pad/轨迹球)

根据您提供的描述,我不能100%肯定这可以解释您的现象,但我认为值得一试。

setSelection()
不一定具有视觉效果。仅当使用D-pad/轨迹球在列表中导航时,选择栏才会出现。如果点击屏幕上的某个内容,选择栏会短暂出现并消失

因此,
setSelection()
只有在活动未处于触摸模式时才会产生视觉影响(即,用户最后做的事情是使用D-pad/轨迹球)


根据您提供的描述,我不能100%肯定这可以解释您的现象,但我认为值得一试……

您可能需要在
post
ed
Runnable
()中包装
setSelection()

您可能需要在
post
ed
Runnable
()

ListView.setItemChecked(int position, boolean checked);

也许您需要使用以下函数:

ListView.setItemChecked(int position, boolean checked);

如果对ListView使用适配器,请将以下代码添加到适配器:

public class MyAdapter extends
        ArrayAdapter<MyClass> {


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            LayoutInflater inflator = (LayoutInflater) getContext()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            rowView = inflator.inflate(R.layout.my_adapter, null);
        } else {
            rowView = (View) convertView;
        }

        //...

        // set selected item
        LinearLayout ActiveItem = (LinearLayout) rowView;
        if (position == selectedItem)
        {
            ActiveItem
                    .setBackgroundResource(R.drawable.background_dark_blue);

            // for focus on it
            int top = (ActiveItem == null) ? 0 : ActiveItem.getTop();
            ((ListView) parent).setSelectionFromTop(position, top);
        }
        else
        {
            ActiveItem
                    .setBackgroundResource(R.drawable.border02);
        }

    }

    private int selectedItem;

    public void setSelectedItem(int position) {
        selectedItem = position;
    }

}

如果对ListView使用适配器,请将以下代码添加到适配器:

public class MyAdapter extends
        ArrayAdapter<MyClass> {


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            LayoutInflater inflator = (LayoutInflater) getContext()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            rowView = inflator.inflate(R.layout.my_adapter, null);
        } else {
            rowView = (View) convertView;
        }

        //...

        // set selected item
        LinearLayout ActiveItem = (LinearLayout) rowView;
        if (position == selectedItem)
        {
            ActiveItem
                    .setBackgroundResource(R.drawable.background_dark_blue);

            // for focus on it
            int top = (ActiveItem == null) ? 0 : ActiveItem.getTop();
            ((ListView) parent).setSelectionFromTop(position, top);
        }
        else
        {
            ActiveItem
                    .setBackgroundResource(R.drawable.border02);
        }

    }

    private int selectedItem;

    public void setSelectedItem(int position) {
        selectedItem = position;
    }

}

也许你应该使用ListView的smoothScrollToPosition(int-position)方法也许你应该使用ListView的smoothScrollToPosition(int-position)方法如果smoothScrollToPosition(int-position)有效,你能告诉我如何将滚动位置设置到列表的中心吗。它出现在可见项的底部

在我的例子中,smoothScrollToPosition(int位置)起作用了,您能告诉我如何将滚动位置设置到列表的中心位置吗。它出现在可见项的底部

对我来说,这有助于
ListView.setChoiceMode(ListView.CHOICE\u MODE\u SINGLE)
列表视图。选择多个模式
然后
ListView.setSelection(位置)
ListView.setItemChecked(位置,true)

工作正常

对我来说,这有助于设置
ListView.setChoiceMode(ListView.CHOICE\u MODE\u SINGLE)
列表视图。选择多个模式
然后
ListView.setSelection(位置)
ListView.setItemChecked(位置,true)

工作正常

我知道这是一个老问题,但我刚刚遇到了一个类似的问题,我用这种方式解决了:

mListView.clearFocus();
mListView.post(new Runnable() {
    @Override
    public void run() {
        mListView.setSelection(index);
    }
});

我知道这是一个老问题,但我只是有一个类似的问题,我用这种方式解决了:

mListView.clearFocus();
mListView.post(new Runnable() {
    @Override
    public void run() {
        mListView.setSelection(index);
    }
});

在我的情况下找到了解决办法。我没有使用Runnable,因为我的类正在扩展ListFragment。我所要做的就是让我的索引成为最终索引; 最终指数=5;
mListView.setSelection(索引)

在我的案例中找到了解决方案。我没有使用Runnable,因为我的类正在扩展ListFragment。我所要做的就是让我的索引成为最终索引; 最终指数=5; mListView.setSelection(索引)

给我打电话

listView.notifyDataSetChanged();
listView.requestFocusFromTouch();
然后

 listView.setSelection(position);
解决了这个问题

如果在runnable中执行此操作,则无需调用requestFocusFromTouch(),但ListView的旧位置会显示为sekound。

对于我调用

listView.notifyDataSetChanged();
listView.requestFocusFromTouch();
然后

 listView.setSelection(position);
解决了这个问题


如果在runnable中执行此操作,则无需调用requestFocusFromTouch(),但ListView的旧位置会显示为sekound。

我发现有时setSelection无法工作,因为我将ListView的属性“android:height”设置为“wrap\u content”

当listView从不可滚动变为可滚动时,我的应用程序将无法工作

例如,如果我的应用程序是“文件浏览器应用程序”。当我的列表小于6时,它是不可滚动的。现在我返回到父目录,它有11个对象,我想将选择设置到某个位置,但它在这里不起作用

to\from    |    Scrollable  | non-Scrollable
可滚动| O | O(当然)

不可滚动的| X | O(当然)

我不想使用post(Runnable),因为会有延迟

==================================

答复:

您可以尝试将“android:height”设置为“match_parent”


天哪,它花了三天时间。

我发现有时候setSelection不起作用,因为我将listView的属性“android:height”设置为“wrap_content”

当listView从不可滚动变为可滚动时,我的应用程序将无法工作

例如,如果我的应用程序是“文件浏览器应用程序”。当我的列表小于6时,它是不可滚动的。现在我返回到父目录,它有11个对象,我想将选择设置到某个位置,但它在这里不起作用

to\from    |    Scrollable  | non-Scrollable
可滚动| O | O(当然)

不可滚动的| X | O(当然)

我不想使用post(Runnable),因为
@Override
protected void handleDataChanged() {
    super.handleDataChanged();
    if (null != mHandleDataChangedListener){
        mHandleDataChangedListener.onChanged();
    }
}
HandleDataChangedListener mHandleDataChangedListener;

public void setHandleDataChangedListener(HandleDataChangedListener handleDataChangedListener) {
    this.mHandleDataChangedListener = handleDataChangedListener;
}

public interface HandleDataChangedListener{
    void onChanged();
}
    mListView.setHandleDataChangedListener(new CustomListView.HandleDataChangedListener() {
        @Override
        public void onChanged() {
            mListView.setHandleDataChangedListener(null);
            mListView.setSelection(0);
        }
    });
    mAdapter.notifyDataSetChanged();