【问题标题】:Click Listener on ListView单击 ListView 上的侦听器
【发布时间】:2011-07-07 10:44:17
【问题描述】:

我已从 SDK 页面修改了此示例,以从手机中获取所有联系人组并显示它们。但是,我无法弄清楚如何单击其中一个,然后使用 Groups._ID 执行其他操作。有人可以教我如何在此列表中获得点击/选择侦听器吗?

MyListAdapter.java

package com.example.simplelist;

import android.app.ListActivity;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.Contacts.Groups;
import android.widget.ListAdapter;
import android.widget.SimpleCursorAdapter;

public class MyListAdapter extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.custom_list_activity_view);
        Cursor mCursor = this.getContentResolver().query(Groups.CONTENT_URI, null, null, null, null);
        startManagingCursor(mCursor);
        ListAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.two_line_list_item, mCursor, new String[] {Groups.NAME, Groups._ID}, new int[] {android.R.id.text1, android.R.id.text2});
        setListAdapter(adapter);
    }
}

custom_list_activity_view.xml

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:orientation="vertical"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         android:paddingLeft="8dp"
         android:paddingRight="8dp">

     <ListView android:id="@id/android:list"
               android:layout_width="fill_parent"
               android:layout_height="fill_parent"
               android:background="#00FF00"
               android:layout_weight="1"
               android:drawSelectorOnTop="false" android:choiceMode="singleChoice" android:clickable="true" />

     <TextView android:id="@id/android:empty"
               android:layout_width="fill_parent"
               android:layout_height="fill_parent"
               android:background="#FF0000"
               android:text="No data"/>
 </LinearLayout>

two_line_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical">

     <TextView android:id="@+id/text1"
         android:textSize="16sp"
         android:textStyle="bold"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"/>

     <TextView android:id="@+id/text2"
         android:textSize="16sp"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"/>
 </LinearLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.simplelist"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="3" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".MyListAdapter"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
    <uses-permission android:name="android.permission.READ_CONTACTS" />
</manifest>

【问题讨论】:

    标签: android listview listadapter onselect simplecursoradapter


    【解决方案1】:

    这应该允许您以您想要的方式与选定的项目进行交互。

    MyListAdapter.java

    package com.example.simplelist;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    import android.app.ListActivity;
    import android.content.ContentResolver;
    import android.content.Context;
    import android.database.Cursor;
    import android.os.Bundle;
    import android.provider.Contacts.Groups;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ListView;
    import android.widget.SimpleAdapter;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class MyListAdapter extends ListActivity {
    
        List<ContactGroup> groups = new ArrayList<ContactGroup>(); 
    
        @Override
        protected void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            this.groups = getContacts();
            ContactGroupAdapter cAdapter = new ContactGroupAdapter(this); 
            setListAdapter(cAdapter);
        }
    
        private List<ContactGroup> getContacts(){
            List<ContactGroup> grps = new ArrayList<ContactGroup>();
            ContentResolver cr = getContentResolver();
            Cursor groupCur = cr.query(Groups.CONTENT_URI, null, null, null, null);
            if (groupCur.getCount() > 0) {
                while (groupCur.moveToNext()) {
                    ContactGroup newGroup = new ContactGroup();
                    newGroup.Id = groupCur.getString(groupCur.getColumnIndex(Groups._ID));
                    newGroup.Name = groupCur.getString(groupCur.getColumnIndex(Groups.NAME));
                    grps.add(newGroup);
                }
            }
            return grps;
        }
    
        @Override
        protected void onListItemClick(ListView l, View v, int position, long id) {
            ContactGroup selectedGroup = new ContactGroup();
            selectedGroup = groups.get(position);
            Toast.makeText(getBaseContext(), selectedGroup.Name + " ID #" + selectedGroup.Id, 1).show();
        }
    
    
        public class ContactGroupAdapter extends BaseAdapter{
            public ContactGroupAdapter(Context c) {
                mContext = c;
            }
            @Override
            public int getCount() {
                return groups.size();
            }
    
            @Override
            public Object getItem(int position) {
                return position;
            }
    
            @Override
            public long getItemId(int position) {
                return position;
            }
    
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                ViewHolder holder;
                if(convertView == null){
                    LayoutInflater vi = LayoutInflater.from(this.mContext);  
                    convertView = vi.inflate(R.layout.two_line_list_item, null);
                    holder = new ViewHolder();
                    convertView.setTag(holder); 
                }
                else {
                    //Get view holder back
                    holder = (ViewHolder) convertView.getTag();
                }
                ContactGroup c = groups.get(position);
                if (c != null) {
                    //Name
                    holder.toptext = (TextView) convertView.findViewById(R.id.text1);
                    holder.toptext.setText(c.Name);
                    //ID
                    holder.bottomtext = (TextView) convertView.findViewById(R.id.text2);
                    holder.bottomtext.setText(c.Id);
                }
                return convertView;
            }
            private Context mContext;
    
        }
        public static class ViewHolder {
            TextView toptext;
            TextView bottomtext;
        }
    
        public class ContactGroup{
            public String Id;
            public String Name;
        }
    
    }
    

    two_line_list_item.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout android:id="@+id/LinearLayout01" android:layout_width="fill_parent" 
        android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android">
    
             <TextView android:id="@+id/text1"
             android:textSize="16sp"
             android:textStyle="bold"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"/>
    
         <TextView android:id="@+id/text2"
             android:textSize="16sp"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"/>
    
    </LinearLayout>
    

    【讨论】:

    • 谢谢分享。我一直在寻找这个很长一段时间=)
    【解决方案2】:

    由于您使用的是 ListActivity,您需要覆盖 onListItemClick()

    protected void onListItemClick(ListView l, View v, int position, long id) {
        // position is the position in the adapter and id is what adapter.getItemId() returns.
        // use one of them to get the group id from the data.
    }
    

    【讨论】:

    • 无论我点击哪里都会返回 android.content.ContentResolver$CursorWrapperInner@45a04508。我做了吐司;)
    • +1 因为这是答案的 1/2。因为无论我在哪里单击,我都将数据绑定到光标,所以我得到的是光标而不是项目。如果我通过迭代生成列表并使用适配器添加它们,那么您的答案就完美了。
    • @Bill Mote 因为您使用的是光标,所以我认为您必须执行 mCursor.moveToPosition(position) 之类的操作。很高兴您成功了!
    猜你喜欢
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多