如何使整行列表视图可点击?

Posted

技术标签:

【中文标题】如何使整行列表视图可点击?【英文标题】:how to make entire row of list view clickable? 【发布时间】:2012-10-03 21:50:30 【问题描述】:

我正在尝试为我的应用程序制作多个联系人选择器。我正在使用带有复选框的自定义布局来选择多个联系人。我面临的问题是,为了选择任何特定的联系人,我需要准确地单击复选框,如果我单击行的其他部分,复选框不会被勾选。我如何确保用户在整行中单击的任何位置都会选中复选框。

activity_contacts_picker.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_ >

<Button
    android:id="@+id/btnShow"
    android:layout_
    android:layout_
    android:text="Show Selected" />

<ListView
    android:id="@android:id/list"
    android:layout_
    android:layout_
    android:layout_below="@+id/btnShow" >
</ListView>

</RelativeLayout>

custcontactview.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linearLayout1"
android:layout_
android:layout_
android:paddingBottom="5.0px"
android:paddingLeft="5.0px"
android:paddingTop="5.0px" >

<TextView
    android:id="@+id/txtContactName"
    android:layout_
    android:layout_
    android:layout_marginLeft="15.0dip"
    android:layout_toLeftOf="@+id/checkBox1"
    android:layout_alignParentLeft="true"
    android:text="Medium Text"
    android:textAppearance="?android:textAppearanceMedium" />

<TextView
    android:id="@+id/txtContactNumber"
    android:layout_
    android:layout_
    android:layout_below="@+id/txtContactName"
    android:layout_alignParentLeft="true"
    android:layout_marginLeft="15.0dip"
    android:layout_toLeftOf="@+id/checkBox1"
    android:text="Small Text"
    android:textAppearance="?android:textAppearanceSmall" />

<CheckBox
    android:id="@+id/checkBox1"
    android:layout_
    android:layout_
    android:layout_alignParentRight="true"
    android:layout_marginRight="10dp"
    android:clickable="true"
    android:focusable="true"
    android:focusableInTouchMode="false" />

</RelativeLayout>

ContactsPicker.java

public class ContactsPicker extends ListActivity 

protected Object mActionMode;
public int selectedItem = -1;
private Button btnShowContacts;
private ListView myListView;

public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_contacts_picker);
    myListView = getListView();
    btnShowContacts = (Button) findViewById(R.id.btnShow);
    btnShowContacts.setOnClickListener(new View.OnClickListener() 
        public void onClick(View v) 
            Toast.makeText(getApplicationContext(), "Button Clicked",
                    Toast.LENGTH_SHORT).show();
            String name = null;
            String number = null;
            long[] ids = myListView.getCheckedItemIds();
            for (long id : ids) 
                Cursor contact = getContentResolver().query(
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        null,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                + " = ?", new String[]  id + "" , null);
                while (contact.moveToNext()) 
                    name = contact.getString(contact
                            .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                    number = contact.getString(contact
                            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                
                Toast.makeText(getApplicationContext(),
                        "Name: " + name + "\n" + "Number: " + number,
                        Toast.LENGTH_LONG).show();
            
        
    );
    ArrayList<Map<String, String>> list = buildData();
    String[] from =  "Name", "Phone" ;
    int[] to =  R.id.txtContactName, R.id.txtContactNumber ;
    SimpleAdapter adapter = new SimpleAdapter(this, list,
            R.layout.custcontactview, from, to);
    setListAdapter(adapter);


private ArrayList<Map<String, String>> buildData() 
    ArrayList<Map<String, String>> list = new ArrayList<Map<String, String>>();
    list.clear();
    Cursor people = getContentResolver().query(
            ContactsContract.Contacts.CONTENT_URI, null, null, null,
            "UPPER(" + ContactsContract.Contacts.DISPLAY_NAME + ") ASC");
    while (people.moveToNext()) 
        String contactName = people.getString(people
                .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
        String contactId = people.getString(people
                .getColumnIndex(ContactsContract.Contacts._ID));
        String hasPhone = people
                .getString(people
                        .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
        if ((Integer.parseInt(hasPhone) > 0)) 
            Cursor phones = getContentResolver().query(
                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    null,
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                            + " = " + contactId,
                    null,
                    "UPPER(" + ContactsContract.Contacts.DISPLAY_NAME
                            + ") ASC");
            while (phones.moveToNext()) 
                String phoneNumber = phones
                        .getString(phones
                                .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                Map<String, String> NamePhoneType = new HashMap<String, String>();
                NamePhoneType.put("Name", contactName);
                NamePhoneType.put("Phone", phoneNumber);
                list.add(NamePhoneType);
            
            phones.close();
        
    
    people.close();
    //startManagingCursor(people);
    return list;


【问题讨论】:

【参考方案1】:

尝试将此属性添加到您的 ListView

android:clickable="true"

另外,我看不到您在哪里为 myListView 设置 Touch/Click 侦听器。

【讨论】:

【参考方案2】:

尝试更改复选框布局宽度以填充父项,如下所示,

 android:layout_

猜猜它会为你工作:)

【讨论】:

【参考方案3】:

我会在文本字段中添加一个单击侦听器,如果单击,则将复选框的状态更改为相反的状态(单击 未单击)

【讨论】:

【参考方案4】:

首先你可以使用 CheckedTextView 代替 CheckBox。也许只有这个工作。

尝试设置 CheckBox focusable="false",如果不起作用,则在您的 XML 布局中的所有视图中都可聚焦。

【讨论】:

【参考方案5】:

如果您在列表项上使用按钮/复选框/单选按钮,则列表项不可点击

您可以通过click here解决您的问题

【讨论】:

以上是关于如何使整行列表视图可点击?的主要内容,如果未能解决你的问题,请参考以下文章

使整行可点击

Jquery Datatables - 使整行成为链接

使用原生js实现一个列表数据展示页面不同的项目状态使整行显示不同颜色。

急急急!!!winform里怎么做可以使datagridview里的鼠标点击cell使整行的背景颜色改变?

如何使列表视图的文本视图可点击

Android - 如何创建可点击的列表视图?