当前位置:  开发笔记 > 编程语言 > 正文

Android自定义ListView无法单击项目

如何解决《Android自定义ListView无法单击项目》经验,为你挑选了4个好方法。

所以我有一个自定义的ListView对象.列表项目有两个堆叠在一起的文本视图,加上一个水平进度条,我想保持隐藏,直到我实际执行某些操作.最右边是一个复选框,我只想在用户需要将更新下载到他们的数据库时显示.当我通过将可见性设置为Visibility.GONE来禁用复选框时,我可以单击列表项.当复选框可见时,除了复选框之外,我无法单击列表中的任何内容.我做了一些搜索,但没有找到任何与我目前的情况相关的东西.我发现了这个问题,但我使用的是重写的ArrayAdapter,因为我正在使用ArrayLists在内部包含数据库列表.我只需要获取LinearLayout视图并像Tom一样添加onClickListener吗?我不确定.

这是listview行布局XML:



    
        
        
        
    
    

这是扩展ListActivity的类.显然它仍在开发中,所以请原谅那些遗漏或可能留下的东西:

public class UpdateActivity extends ListActivity {

    AccountManager lookupDb;
    boolean allSelected;
    UpdateListAdapter list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        lookupDb = new AccountManager(this);
        lookupDb.loadUpdates();

        setContentView(R.layout.update);
        allSelected = false;

        list = new UpdateListAdapter(this, R.layout.update_row, lookupDb.getUpdateItems());
        setListAdapter(list);

        Button btnEnterRegCode = (Button)findViewById(R.id.btnUpdateRegister);
        btnEnterRegCode.setVisibility(View.GONE);

        Button btnSelectAll = (Button)findViewById(R.id.btnSelectAll);
        btnSelectAll.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                allSelected = !allSelected;

                for(int i=0; i < lookupDb.getUpdateItems().size(); i++) {
                    lookupDb.getUpdateItem(i).setSelected(!lookupDb.getUpdateItem(i).isSelected());
                }

                list.notifyDataSetChanged();
                // loop through each UpdateItem and set the selected attribute to the inverse 

            } // end onClick
        }); // end setOnClickListener

        Button btnUpdate = (Button)findViewById(R.id.btnUpdate);
        btnUpdate.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
            } // end onClick
        }); // end setOnClickListener

        lookupDb.close();
    } // end onCreate


    @Override
    protected void onDestroy() {
        super.onDestroy();

        for (UpdateItem item : lookupDb.getUpdateItems()) {
            item.getDatabase().close();        
        }
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);

        UpdateItem item = lookupDb.getUpdateItem(position);

        if (item != null) {
            item.setSelected(!item.isSelected());
            list.notifyDataSetChanged();
        }
    }

    private class UpdateListAdapter extends ArrayAdapter {
        private List items;

        public UpdateListAdapter(Context context, int textViewResourceId, List items) {
            super(context, textViewResourceId, items);
            this.items = items;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View row = null;

            if (convertView == null) {
                LayoutInflater li = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                row = li.inflate(R.layout.update_row, null);
            } else {
                row = convertView;
            }

            UpdateItem item = items.get(position);

            if (item != null) {
                TextView upper = (TextView)row.findViewById(R.id.UpdateNameText);
                TextView lower = (TextView)row.findViewById(R.id.UpdateStatusText);
                CheckBox cb = (CheckBox)row.findViewById(R.id.UpdateCheckBox);

                upper.setText(item.getName());
                lower.setText(item.getStatusText());

                if (item.getStatusCode() == UpdateItem.UP_TO_DATE) {
                    cb.setVisibility(View.GONE);
                } else {
                    cb.setVisibility(View.VISIBLE);
                    cb.setChecked(item.isSelected());
                }

                ProgressBar pb = (ProgressBar)row.findViewById(R.id.UpdateProgress);
                pb.setVisibility(View.GONE);
            }
            return row;
        }

    } // end inner class UpdateListAdapter
}

编辑:我还有这个问题.我正在作弊并在textview上添加onClick处理程序,但是当我没有点击我的复选框时,我的onListItemClick()函数根本没被调用似乎非常愚蠢.



1> MattC..:

问题是Android不允许您选择具有可聚焦元素的列表项.我修改了列表项上的复选框,使其具有如下属性:

android:focusable="false"

现在,包含复选框(适用于按键太)是传统意义上的"选择"我的列表项(它们亮起来,你可以在列表项的任意位置单击和"onListItemClick"处理器将火等).

编辑:作为更新,一位评论者提到"只是一个注释,在更改按钮的可见性后,我必须以编程方式再次禁用焦点."


当在列表项中使用ImageButton时,出现此解决方案不起作用.:(
很好的答案谢谢,也适用于ImageButtons.只需注意,在更改按钮的可见性后,我必须以编程方式再次禁用焦点.

2> micnoy..:

如果您在列表项中包含ImageButton,则应将descendantFocusability值设置为根列表项元素中的"blocksDescendants".

android:descendantFocusability="blocksDescendants"

并在视图中的focusableInTouchMode标志.trueImageButton

android:focusableInTouchMode="true"



3> Andrew Burge..:

我发生了类似的问题,发现CheckBox在ListView中相当挑剔.它会发生在整个ListItem上的意图,并覆盖onListItemClick.您可能希望为其实现单击处理程序,并为CheckBox设置text属性,而不是使用TextViews.

我会说看看这个View对象,它可能比CheckBox更好用

选中的文本视图


我发现如果为列表中的可聚焦项设置"focusable"设置为false,则可以再次使用onListItemClick函数.
但是,复选框会像列表项一样变为橙色.有人知道解决方案吗?

4> 小智..:

在列表项的根视图中使用此行

机器人:descendantFocusability = "blocksDescendants"

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有