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

Mar*_*tyn 19 java android listview list

我是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);
    }   

}
Run Code Online (Sandbox Code Playgroud)

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

<?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>
Run Code Online (Sandbox Code Playgroud)

谢谢

Vik*_*šan 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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 小心这个解决方案.BaseAdapter的文档声明如下"如果指定位置的项不是分隔符,则返回true".这意味着如果您返回false,则该项目是分隔符项目.有些手机可能无法在普通项目和分隔项目之间绘制android:divider. (15认同)

Mat*_*ias 11

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

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

class MenuAdapter extends ArrayAdapter<String> {

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

}
Run Code Online (Sandbox Code Playgroud)

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

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


Rag*_*ari 6

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

setClickable(false)
Run Code Online (Sandbox Code Playgroud)

setFocusable(false)
Run Code Online (Sandbox Code Playgroud)

例如,在您的适配器中.

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

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

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

  • 我尝试了你的解决方案,它可以正常工作,但是反过来!我有这个:`public View getView(int position,View convertView,ViewGroup parent){View row = convertView; if(row == null){row = inflater.inflate(R.layout.row_style,parent,false); } row.setFocusable(false); row.setClickable(假); 返回行; 这使我的所有行都启用(可点击).但是如果我使用`row.setFocusable(true); row.setClickable(true);`行是不可点击的.很奇怪 ... (6认同)
  • 对于那些认为行为反过来的人来说,事实并非如此.当您使列表项可单击(true)时,后续单击将传递到列表项本身,因此该事件不会传播到父项(listview).如果列表项没有对点击作出反应,则没有任何反应. (5认同)