如何在ListView的setOnItemClickListener中取消Android ListView项目的激活/高亮显示?
在我的一项活动中,我有多个ListView控件。说清单1,清单2 & 清单3。在列表1项目的点击,我加载数据为列表2 & 列表3从web服务。被点击的项目的背景被突出显示。我通过以下选择器实现了这一点如何在ListView的setOnItemClickListener中取消Android ListView项目的激活/高亮显示?
<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"/>
正如你所看到的,我已指定机器人:state_activated =“真”改变点击/轻按的项目的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服务,我无法停止突出显示/激活项目。
我该如何操作?
在下午8时08分2012年3月19日编辑:没有正确答复可是...我坚持&等待任何帮助
我居然遇到了同样的问题,前几天。解决方案是而不是来设置view.setItemChecked(false),而是在.onItemClick()
-方法中,调用您的列表视图并设置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);
}
}
});
的onclick监听器,你可以在查看通话setonclicklistener(空)内这称为点击事件。这种方式将删除自己的onclicklistener。
mTitleView.setOnClickListener(null)
谢谢..但这不是我想 – Aamir 2012-03-14 13:14:00
,如果你不想处理单击事件第一次点击后,只需使用yourList.setOnItemClickListener(null)
谢谢..但这不是我想要的 – Aamir 2012-03-14 13:13:48
@AamirHabib wouldnt它是一个更好的主意,以防止您的用户点击其他项目(这种答案建议的方式),而不仅仅是禁用亮点?这样,您的用户就可以确切地知道特定的列表条目目前不可用于采取行动。 – Urban 2012-03-22 22:16:12
我已经做了同样的方式...通过禁用整个列表两秒钟,当一个项目被点击的目的是网络服务响应会在这几秒钟内收到......但我正在寻找类似的东西@Reinier建议...我可能是错误的..但那东西按我的计划工作 – Aamir 2012-03-23 12:34:41
listView.setOnItemClickListener(new OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> adapterView, View view,
int position, long arg3)
{
//view.setEnabled(false);
//adapterView.setEnabled(false);
}
});
view.setEnabled(假);如果要禁用用户点击过的listItem,请使用此选项。这样可以防止该特定项目上的onclick事件。
adapterView.setEnabled(false);如果你想禁用整个listView,使用这个。 它会阻止整个listView上的onclick事件。
希望这有助于
谢谢你的答案..但这不起作用...我尝试使用** view.setSelected(false)**太,但不是工作。 ...其实我想防止被点击的项目被选中/突出显示,如果某些其他项目的数据正在加载..我也更新了我的问题 – Aamir 2012-03-14 12:43:30
请在禁用适配器的项目。这将删除所有点击,而不必禁用项目点击侦听器或其他类似的黑客。
我不知道你的适配器是怎么样的,但通常你会覆盖你的适配器中的一些方法。请注意,我调用方法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参数时,您将不得不通知该数据集已更改。这将导致listview重新查询适配器。 例如:
public void setIsLoading(final boolean isLocked) {
mIsLocked = isLocked;
notifyDatasetChanged();
}
为什么要取消点击? – 2012-03-14 10:37:40
为什么你不只是做一个if语句到你的onItemClick方法?如果这是onItemClick函数中的第一件事,那么它与onBeforeClick()函数基本相同... – KarlKarlsom 2012-03-14 10:57:07
我已更新我的问题并已解释。对不起,提供一个不明确的问题 – Aamir 2012-03-14 13:04:53