Android:如何在列表创建时禁用列表项

时间:2010-02-02 11:27:35

标签: java android list listview

我是Android开发人员的新手,并且还在做很多事情。

我有一个主菜单显示使用以下代码,但无法解决如何禁用菜单中的选定项目。有人可以帮我提供一些示例代码吗?

public class listTest extends ListActivity {

    @Override
    public void onCreate(Bundle savedState) {
        super.onCreate(savedState);
        setListAdapter(ArrayAdapter.createFromResource(this, R.array.mainMenu,
                android.R.layout.simple_list_item_1)); 
        //not sure how to disable list items here
    }

    protected void onListItemClick(ListView list, View view, int position, long id) {
        // can disable items when they are clicked on
        view.setEnabled(false);
    }   

}

我的strings.xml文件中有一个string-array

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="mainMenu">
        <item>Item 1</item>
        <item>Item 2</item>
        <item>Item 3</item>
    </string-array> 
</resources>

谢谢

4 个答案:

答案 0 :(得分:43)

为了在列表创建时禁用列表项,您必须从ArrayAdapter创建子类。您必须覆盖以下方法:isEnabled(int position)areAllItemsEnabled()。在前者中,您返回truefalse取决于是否启用给定位置的列表项。在后者中,您返回false

如果你想使用createFromResource(),你也必须实现该方法,因为ArrayAdapter.createFromResource()仍然实例化ArrayAdapter而不是你自己的适配器。

最后,代码如下所示:

class MenuAdapter extends ArrayAdapter<CharSequence> {

    public MenuAdapter(
            Context context, int textViewResId, CharSequence[] strings) {
        super(context, textViewResId, strings);
    }

    public static MenuAdapter createFromResource(
            Context context, int textArrayResId, int textViewResId) {

        Resources      resources = context.getResources();
        CharSequence[] strings   = resources.getTextArray(textArrayResId);

        return new MenuAdapter(context, textViewResId, strings);
    }

    public boolean areAllItemsEnabled() {
        return false;
    }

    public boolean isEnabled(int position) {
        // return false if position == position you want to disable
    }
}

答案 1 :(得分:11)

我相信列表项是否已启用是该项目状态的一部分,因此我猜您必须在ListAdapter中进行管理。子类化适配器时,可以覆盖isEnabled(position)。对于您在此处返回的任何位置,ListView会将此项目标记为已禁用。

所以你想要做的是这样的事情:

class MenuAdapter extends ArrayAdapter<String> {

    public boolean isEnabled(int position) {
       // return false if position == positionYouWantToDisable
    }

}

这可能需要例如如果您希望能够使用setter启用/禁用项目,则Map管理每个项目的启用状态。

然后在ListView上设置自定义适配器。

答案 2 :(得分:6)

您可以通过同时调用

来禁用列表项(=使其不响应触摸)
setClickable(false)

setFocusable(false)
例如,在您的适配器中

默认情况下,这不会以图形方式自动反映出来。

我目前在列表中使用它的列表项不可点击但其中大部分包含可点击的小部件。效果很好。

这样,列表项目通常包括分隔符(参见Janusz对上面接受的答案的回复)。

答案 3 :(得分:-3)

或以简单的方式取消注册并注册 OnItemClickListener 可能是一个更好的主意。

注册:

  

lstDevice.setOnItemClickListener(上下文);

取消注册:

  

lstDevice.setOnItemClickListener(空);