如何取消Android ListView项目在ListView的setOnItemClickListener中被激活/突出显示?



在我的一个活动中,我有多个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);
        }
    });
  1. view.setEnabled(false);如果要禁用用户单击的listItem,请使用此选项。因此,可以防止该特定项上的onclick事件。

  2. adapterView.setEnabled(false);如果要禁用整个列表视图,请使用此选项。它将阻止整个listView上的onclick事件。

希望这能帮助

最新更新