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()
。 在前者,你可以根据给定的位置是否启用列表项来返回true
或false
。 后者你会返回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 } }
我相信是否启用列表项是该项目的状态的一部分,所以我想你必须在你的ListAdapter
pipe理。 当对适配器进行子类化时,可以覆盖isEnabled(position)
。 对于任何你在这里返回true的位置,ListView将把这个项目标记为禁用。
所以你想要做的是这样的:
class MenuAdapter extends ArrayAdapter<String> { public boolean isEnabled(int position) { // return false if position == positionYouWantToDisable } }
这可能需要一个Map
pipe理每个项目的启用状态,如果你想能够使用setter启用/禁用一个项目。
然后在您的ListView上设置自定义适配器。
您可以通过调用这两个选项禁用列表项(=使其不响应触摸)
setClickable(false)
和
setFocusable(false)
例如在你的适配器中。
默认情况下,这不会自动以graphics方式反映出来。
我目前正在列表中使用它的列表项不可点击,但其中大部分包含可点击的小部件。 效果很好。
这样,列表项通常包括分隔符(请参阅Janusz对上面接受的答案的答复)。
或者以简单的方式来注销和注册OnItemClickListener可以是一个更好的主意。
注册:
lstDevice.setOnItemClickListener(上下文);
注销:
lstDevice.setOnItemClickListener(NULL);