Android ListView setSelection()似乎不工作

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

现在有一个onClickListener()监听button单击,它执行一些操作,也调用doSomething()

在第一种情况下,select的项目得到适当的定位,但在后者,没有任何反应。

任何关于这个奇怪的行为的线索,以及如何使它工作?

也许你需要使用function:

 ListView.setItemChecked(int position, boolean checked); 

在调用setSelection()方法之前使用requestFocusFromTouch()

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

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

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

setSelection()不一定具有视觉效果。 只有使用D-pad / trackball导航列表时才会出现select栏。 如果点击屏幕点击,select栏会短暂显示并消失。

因此,如果活动不处于触摸模式(即,用户所做的最后一件事是使用D-pad /轨迹球),则setSelection()将仅具有视觉影响。

我不是100%肯定的,这解释了你的现象,给出你提供的描述,但我认为这是值得一试的…

如果您使用适配器为您的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; } } 

在您的活动中:

 myAdapter.setSelectedItem(1); 

也许你应该使用ListView的smoothScrollToPosition(int position)方法

给我打电话

 listView.notifyDataSetChanged(); listView.requestFocusFromTouch(); 

接着

  listView.setSelection(position); 

解决了这个问题。

如果你在一个runnable中这样做,它可以不调用requestFocusFromTouch(),但ListView的旧位置显示为一个sekound。

我有一个非常大的请求与Webcontent。 当我在onCreateView中使用代码时,Listview甚至没有完成加载。 我把它放在我的AsyncTask的onPostExecute。

  //Get last position in listview if (listView != null && scrollPosition != 0) { listView.clearFocus(); listView.requestFocusFromTouch(); listView.post(new Runnable() { @Override public void run() { listView.setItemChecked(scrollPosition, true); listView.setSelection(scrollPosition); } }); } 

不要忘记设置点击检查项目;)

在我的情况下,smoothScrollToPosition(int position)工作,你能告诉我如何设置滚动的位置到列表的中心。 它出现在可见项目的底部。

对我来说,这有助于设置
ListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);ListView.CHOICE_MODE_MULTIPLE
然后
ListView.setSelection(position)ListView.setItemChecked(position, true);
工作正常

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

我发现有时setSelection将无法正常工作,因为我设置listView的属性“android:height”为“wrap_content”。

而我的应用程序将无法正常工作的时间是,当listView成为不可滚动的滚动。

例如,如果我的应用程序是“文件浏览器应用程序”。 当我的列表不到,比如说6,那么它是不可滚动的。 现在我回到父目录,它有11个对象,我想把select设置到某个位置,这里不起作用。

 to\from | Scrollable | non-Scrollable 

可滚动| O | O(当然)

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

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

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

回答:

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

上帝,它花了三天。

当使用post来setSelection()ListView将首先看到,然后滚动到位置,感谢“ 魏经轩 ”,然后布局实际上会影响setSelection() ,因为setSelection()调用setSelectionFromTop(int position, int y)还有另一种解决方法。

 listView.setAdapter(listView.getAdapter()); listView.setSelection(123); 

只需尝试此代码

  listView.setAdapter(adapter); listView.setSelection(position); adapter.notifyDataSetChanged(); 

对我来说,解决这个问题的方法是:

 listView.clearChoices();