2011-03-02 76 views
3

我已经从SDK页面修改此示例以从手机中获取所有联系人组并显示它们。然而,我不能弄清楚如何点击其中的一个,然后使用Groups._ID去做别的事情。有人可以教我如何获得这个列表上的点击/选择监听器吗?单击ListView上的监听器

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> 

回答

5

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

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> 
+0

感谢您的分享。我一直在寻找这一段时间=) – AuroraBlaze 2015-06-04 04:15:04

4

由于您使用的是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. 
} 
+0

无论在哪里我点击返回[email protected]。我做吐司;) – 2011-03-02 17:20:39

+0

+1因为这是1/2的答案。因为我将数据绑定到一个游标,无论我点击了什么,我都得到了游标而不是项目。如果我通过遍历它并使用适配器添加它们来生成列表,那么您的答案完美无缺。 – 2011-03-04 11:55:34

+1

@Bill Mote,因为你正在使用游标我假设你不得不做一些像mCursor.moveToPosition(position)等等。很高兴你能使用它! – 2011-03-04 13:13:07