7

我使用联系人同步制作了一个应用程序。我列出了以下联系信息,包括照片、姓名和电话号码。我成功地在自定义ListView中列出了所有这些内容,但我无法单击ListView。它看起来像被锁定,无法单击它。

但我对另一个活动做了同样的程序。使用自定义ListView但我可以单击此视图并且它工作正常。

问题是什么?这是我的示例编码:

    ListView settingsList = (ListView) findViewById(R.id.manage_track_listView);
    ArrayList<ContactList> MySettingsList = new ArrayList<ContactList>();

    ContactList setting1 = new ContactList("contact name 1", "Number 1", null);
    ContactList setting2 = new ContactList("contact name 2", "Number 2", null);
    ContactList setting3 = new ContactList("contact name 3", "Number 3", null);

    MySettingsList.add(setting1);
    MySettingsList.add(setting2);
    MySettingsList.add(setting3);

    ContactList list[] = new ContactList[MySettingsList.size()];

    for(int i=0;i<MySettingsList.size();i++) {

        ContactList mySettings = MySettingsList.get(i);
        list[i] = new ContactList(mySettings.getName(), mySettings.getNumber(), mySettings.getImageIcon());
    }

    ContactListAdapter adapter = new ContactListAdapter(this, R.layout.manage_track_list_custom_view, list);
    settingsList.setAdapter(adapter);
    System.out.println("before listener");
    settingsList.setOnItemClickListener(new OnItemClickListener() {

        @Override


        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            // TODO Auto-generated method stub

            System.out.println("Clicked " + position);
        }
    });
    System.out.println("after listener");

这里的 ContactList 是一个类,它具有联系人姓名、号码和 imageBlob 的 byte[]。如果图像为空,我将默认 ic_launcher 设置为联系人图像。适配器类是:

public class ContactListAdapter extends ArrayAdapter<ContactList> {

    Context context;
    int layoutResourceId;
    ContactList objects[] = null;

    View row;

    public ContactListAdapter(Context context, int layoutResourceId, ContactList[] objects) {
        super(context, layoutResourceId, objects);
        // TODO Auto-generated constructor stub

        this.context = context;
        this.layoutResourceId = layoutResourceId;
        this.objects = objects; 
        System.out.println(objects[1].getName());
        System.out.println(objects[1].getNumber());
        System.out.println(objects[1].getImageIcon());
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

        row = convertView;
        final ContactListHolder holder;

        if ( row == null ) {

            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);

            holder = new ContactListHolder();
            holder.image    = (ImageView) row.findViewById(R.id.contactImage);
            holder.name     = (TextView) row.findViewById(R.id.contactName);
            holder.number   = (TextView) row.findViewById(R.id.contactNumber);
            holder.check    = (CheckBox) row.findViewById(R.id.selectedContact);

            row.setTag(holder);

        } else {

            holder = (ContactListHolder)row.getTag();
        }

        ContactList contact = objects[position];
        if(contact.imageIcon != null) {

            Bitmap imgBitmap = BitmapFactory.decodeByteArray(contact.imageIcon, 0, contact.imageIcon.length);
            holder.image.setImageBitmap(imgBitmap);
        } else {

            holder.image.setImageResource(R.drawable.ic_launcher);
        }

        holder.name.setText(contact.name);
        holder.number.setText(contact.number);
        holder.check.setChecked(objects[position].isSelected());    

        return row;

    }

    static class ContactListHolder {

        ImageView image;
        TextView name;
        TextView number;
        CheckBox check;
    }
}

我有 100 多个联系人,所以只添加了 3 个对象。在此联系人列表中,我成功收到联系人图片、姓名、号码。

ListView无法点击是什么问题?我希望你们中的任何人都会指导我。提前致谢。


谢谢大家。现在只需添加android:focusable="false"我的所有子视图即可得到结果。感谢您的指导。

4

6 回答 6

9

在嵌套视图中,子视图总是首先获取所有的触摸事件。如果您希望父视图(在您的情况下为 listView 行)获取触摸事件,则必须在子事件上返回 false 或将它们设置android:clickable="false"在清单中。

于 2012-06-26T08:49:19.010 回答
8

添加

 android:focusable="false"  

 android:clickable="false"

对于每个子视图,如 imageview、textview、checkbox 等......您的行布局意味着在manage_track_list_custom_view.xml

于 2012-06-26T09:14:52.757 回答
3

我认为你必须设置所有可点击的东西,例如。复选框、按钮等不可聚焦(在适配器类中)。

        holder.yourButton.setFocusable(false);
        holder.yourButton.setFocusableInTouchMode(false);

        holder.yourCheckbox.setFocusable(false);
        holder.yourCheckbox.setFocusableInTouchMode(false);
于 2012-06-26T09:17:50.957 回答
1

试试这个:

添加 listView 时,调用

setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS);

这里查看更多信息。

于 2012-06-26T09:19:37.940 回答
0

您可以将 onclick listner 设置为 ContactListAdapter 类中的 View 行。

    holder.check.setChecked(objects[position].isSelected());    
       row.setOnclickListner(new Onclicklistner(){
          // Your code here
       });
    return row;
于 2012-06-26T09:18:38.227 回答
0

当我无法在列表视图中单击项目的其他部分时,我遇到了同样的问题,只能单击该项目内的 textview 或 imageview。所以我设置了我的文本视图:

android:layout_width="fill_parent"

我的项目是这样的:

<relative>
[image][textview]
relative/>

并且单击事件工作正常,因为我单击了文本视图。希望能帮助任何有同样问题的人。

于 2015-06-19T07:31:38.697 回答