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
edRunnable
()中包装setSelection()
。您可能需要在post
edRunnable
()
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();