在我的一个活动中,我有多个ListView控件。说列表1,列表2&列出3。在List1项目的单击中,我加载List 2&从Web服务中列出3。单击的项目的背景将高亮显示。我通过以下选择器实现了这一点。
<item android:drawable="@drawable/item_pressed" android:state_pressed="true"/>
<item android:drawable="@drawable/item_focused" android:state_focused="false"
android:state_pressed="false"
android:state_selected="true"/>
<item android:state_activated="true" android:drawable="@drawable/item_selected"/>
正如您所看到的,我已经指定android:state_activated="true"来更改单击/点击项目的BG。这很有效。
事实上,如果正在加载其他项目的数据,我想防止单击的项目被选中/突出显示。。。像
list1.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// load data if no other call to web service is in progress
if (_isNotLoadingData) {
loadList2AndList3DataUsingWebService();
} else {
//Stop This Item From selected/highlighted
//BUT none of the following work. .. Item is always Selected
view.setSelected(false);
//view.setActivated(false);
//view.setEnabled(false);
}
}
});
上面的代码停止了多个指向我们的web服务的调用,但如果没有为该ListView项调用web服务,我无法阻止该项被突出显示/激活。
我该怎么办?
2012年3月19日晚8:08编辑:尚未得到适当回复。。。我被卡住了&正在等待任何帮助
几天前我确实遇到了同样的问题。解决方案不是设置view.setItemChecked(false),而是在.onItemClick()
-方法中,调用listview并设置listview.setItemChecked(position, false)
。这为我解决了问题。
示例:
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view,
int position, long arg3) {
// load data if no other call to web service is in progress
if (_isNotLoadingData) {
loadList2AndList3DataUsingWebService();
} else {
ListView lv = (ListView) adapterView;
lv.setItemChecked(position, false);
}
}
});
禁用适配器中的项。这将删除所有点击,而你不必禁用项目点击监听器或其他类似的技巧。
我不知道你的适配器看起来怎么样,但通常你会覆盖适配器中的一些方法。请注意,我调用的方法是isLocked,而不是isNotLocked。使用负布尔值通常是一个坏主意,会导致混乱,在这种情况下,您甚至不必在开始时将其设置为false,因为这是布尔值的默认值。
public class MyCoolAdapter extends ListAdapter {
private boolean mIsLocked;
public boolean areAllItemsEnabled () {
return false;
}
public abstract boolean isEnabled (int position) {
if (mIsLocked) {
return false;
}
return true;
}
...
}
如果只想禁用某些行,则对这些位置返回false,对其他位置返回true。
当您更改isLoading参数时,您必须通知数据集已更改。这将导致列表视图重新查询适配器。例如:
public void setIsLoading(final boolean isLocked) {
mIsLocked = isLocked;
notifyDatasetChanged();
}
在onclick监听器中,您可以在调用click事件的视图上调用setonclicklistener(null)。这样视图将删除自己的onclicklistener。
mTitleView.setOnClickListener(null)
尝试使用setSelector将列表选择器设置为null。
如果您不想在第一次点击后处理点击事件,只需使用yourList.setOnItemClickListener(null)
listView.setOnItemClickListener(new OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> adapterView, View view,
int position, long arg3)
{
//view.setEnabled(false);
//adapterView.setEnabled(false);
}
});
view.setEnabled(false);如果要禁用用户单击的listItem,请使用此选项。因此,可以防止该特定项上的onclick事件。
adapterView.setEnabled(false);如果要禁用整个列表视图,请使用此选项。它将阻止整个listView上的onclick事件。
希望这能帮助