Android:如何禁用列表创build列表项目

我很新的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> 

谢谢

为了禁用列表创build列表项目,你必须从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 } } 

我相信是否启用列表项是该项目的状态的一部分,所以我想你必须在你的ListAdapterpipe理。 当对适配器进行子类化时,可以覆盖isEnabled(position) 。 对于任何你在这里返回true的位置,ListView将把这个项目标记为禁用。

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

 class MenuAdapter extends ArrayAdapter<String> { public boolean isEnabled(int position) { // return false if position == positionYouWantToDisable } } 

这可能需要一个Mappipe理每个项目的启用状态,如果你想能够使用setter启用/禁用一个项目。

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

您可以通过调用这两个选项禁用列表项(=使其不响应触摸)

 setClickable(false) 

 setFocusable(false) 

例如在你的适配器中。

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

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

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

或者以简单的方式来注销和注册OnItemClickListener可以是一个更好的主意。

注册:

lstDevice.setOnItemClickListener(上下文);

注销:

lstDevice.setOnItemClickListener(NULL);