Android ListView setSelection()似乎不工作
我有一个ListActivity
实现onListItemClick()
并调用类的doSomething()
函数。 后者包含l.setSelection(position)
,其中l
是ListView
对象。
现在有一个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();