2010-02-02 43 views
19

禁用列表中的项目我很新的Android开发人员,并仍在制定了很多东西。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> 

谢谢

+0

几个快速说明:如果你想要一个菜单​​,当用户按菜单键时弹出,然后检查'Activity'中的'onCreateOptionsMenu'方法。另外,你不需要像这样坚持应用程序上下文;一个'Activity'已经扩展了'Context'(正如你在调用'createFromResource(this,...)'时看到的那样) – 2010-02-02 11:44:44

+0

我想要一个主菜单,当应用程序第一次打开时显示,所以optionsMenu和contextMenu没有任何好,我已经得到了列表显示和可以禁用的项目,他们已经被点击时: \t保护无效onListItemClick(ListView控件列表,查看视图,INT位置,长的id){ \t \t视图。的setEnabled(假);} \t 但我不如何的onCreate选择的列表项设置为禁用想法 注意到应用程序上下文 - 感谢 – Martyn 2010-02-02 11:51:48

回答

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 
    } 
} 
+15

请小心使用此解决方案。 BaseAdapter的文档声明如下“如果指定位置的项目不是分隔符,则返回true。”这意味着如果您返回false,则该项目是分隔项目。有些手机可能无法在正常项目和分隔项目之间绘制android:divider。 – Janusz 2011-07-27 09:50:24

+0

@Janusz是的,我遇到了这个问题的分隔线,因为当我在某些索引处禁用了该项目时,分隔线消失了。所以我在索引中指出了一点灰色看起来是禁用的:) – 2013-04-12 12:21:39

+0

@AliImran:请你详细说明一下如何处理这个问题,而不是绘制分隔线?谢谢 – dentex 2015-05-19 08:49:40

11

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

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

class MenuAdapter extends ArrayAdapter<String> { 

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

} 

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

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

+0

感谢您的回复,这看起来不错,但有实施它的问题。 (MenuAdapter.createFromResource(this,R.array.mainMenu,android.R.layout.simple_list_item_1)); MenuAdapter mainMenuList =(MenuAdapter)getListAdapter(); mainMenuList.isEnabled(2); //只是设置返回false atm 任何想法,我哪里出错了?它目前只是崩溃 – Martyn 2010-02-03 11:31:35

+0

那么,你得到的例外是什么? – Matthias 2010-02-03 13:29:28

+0

02-03 13:51:21.971:错误/ AndroidRuntime(1365):java.lang.RuntimeException:无法启动活动ComponentInfo {com.martyn.test/com.martyn.test.test}:java.lang.ClassCastException: android.widget.ArrayAdapter – Martyn 2010-02-03 13:51:57

6

您可以禁用列表项(=使它不要触摸响应)调用都

setClickable(false) 

setFocusable(false) 

在适配器中,例如。

默认情况下,不会自动图形反映,虽然。

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

这样,列表中的项目通常包括绘制的分隔符(见雅努什”上述接受的答案回复)。

+0

你能更具体吗?你在哪里调用适配器?你的答案看起来非常有前途,但我不知道如何实现它...... – Pooks 2012-02-09 07:43:57

+1

我已经实现了'BaseAdapter'的子类,它在'getView'方法中扩充了列表单元格布局。在布局XML中,根元素(在我的情况下)是一个'LinearLayout',既不可聚焦也不可点击:'android:focusable =“false”'和'android:clickable =“false”' – Raginmari 2012-02-13 14:21:08

+0

您也可以这样做通过在代表列表项目的视图上调用'setClickable(false)'和'setFocusable(false)''''''getView'方法的代码。 – Raginmari 2012-02-13 14:23:56

-3

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

要注册:

lstDevice.setOnItemClickListener(上下文);

要取消注册:

lstDevice.setOnItemClickListener(空);

+0

你不明白这个问题.. – Siddharth 2014-05-12 06:18:29