如何在自定义适配器类中使用联系人填充ListView?

时间:2012-05-11 09:12:42

标签: android android-listview contacts

我有一个自定义适配器。在我的getView()中,我正在尝试使用我的联系人列表填充“holder.contact”,但没有成功。我确实有这种用联系人填充ListView的方法,但它会破坏我CheckBoxes的功能。此代码不在我的CustomAdapter类中:

public void populateContactList() {
    // Build adapter with contact entries
    Cursor cursor = getContacts();
    String[] fields = new String[] {
            ContactsContract.Data.DISPLAY_NAME       
    };

    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.contact_entry, cursor,
            fields, new int[] {R.id.contactEntryText});    
    lv.setAdapter(adapter);    
} // END POPULATECONTACTLIST

public Cursor getContacts()
{ 
    // Run query
    Uri uri = ContactsContract.Contacts.CONTENT_URI;
    String[] projection = new String[] {
            ContactsContract.Contacts._ID,
            ContactsContract.Contacts.DISPLAY_NAME        
    };

    String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" +
            (false ? "0" : "1") + "'";
    String[] selectionArgs = null;
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";

    return managedQuery(uri, projection, selection, selectionArgs, sortOrder);
} // END GETCONTACTS 

但是我试图在这里定义它,但没有成功(Custom Adapter类):

@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
    View rowView = convertView;
    ViewHolder holder = null;

    if (rowView == null) {
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(
                                           Context.LAYOUT_INFLATER_SERVICE);
        // HERE I AM INFLATING LISTVIEW LAYOUT.
        rowView = inflater.inflate(R.layout.contact_entry, null, false);
        holder = new ViewHolder();
        holder.photo = (ImageView) rowView.findViewById(R.id.iv_contactPic);
        holder.contact = (TextView) rowView.findViewById(R.id.contactEntryText);
        holder.tv = (TextView) rowView.findViewById(R.id.SMSCounttext);
        holder.cb = (CheckBox) rowView.findViewById(R.id.cb_contactHistoryChk);


        rowView.setTag(holder);

    } else {
        holder = (ViewHolder) rowView.getTag();
    }

有没有办法在getView()中应用我的 populateContactList()方法?

我的构造函数看起来像这样。 “elements”已被另一个textview使用:

public CustomAdapter(Context context, int type, ArrayList<String> elements){
    super(context, type, elements);

1 个答案:

答案 0 :(得分:1)

你的问题有点含糊不清。您有populateContactList()CursorContacts数据绑定到SimpleCursorAdapter,并且您希望在另一个自定义getView()方法中使用此方法Adapter 1}}(如果是这种情况,不要这样做)?或者您想使用自己的适配器并将其与联系人绑定(如果是这种情况,那么请使用查询结果cursor和您自己的Adapter)?

您没有说明您的自定义Adapter扩展到哪种Adapter。如果它是基于Cursor的{​​{1}},那么事情很简单,您可以使用AdapterbindView来访问游标数据(并传递newView从构造函数中的Cursor(到超类))。否则,将getContacts()中的Cursor数据放入getContacts()之类的结构中,并将其用作适配器的数据。 (我建议选择第一个选项)。

此外,您的工作是保持行布局中ArrayList的状态(这里有很多关于如何执行此操作的问题)。

编辑:

CheckBoxes

编辑:
使用元素 ArrayList<String> names = new ArrayList<String>(); Cursor cursor = getContacts(); while (cursor.moveToNext()) { names.add(cursor.getString(cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME ))); } 并将其绑定到行:

ArrayList