1

カスタムアダプタがあります。内で、「holder.contact」getView()に連絡先のリストを入力しようとしていますが、成功しません。私には連絡先を入力するこの方法がありますが、それは私の機能を混乱させます。このコードは私のクラスの外にあります:ListViewCheckBoxesCustomAdapter

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 

しかし、私はここでそれを定義しようとしていますが、成功していません(カスタムアダプタクラス):

@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();
    }

内にpopulateContactList()メソッドを適用する方法はありgetView()ますか?

私のコンストラクターは次のようになります。「要素」はすでに別のテキストビューで使用されています。

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

1 に答える 1

0

あなたの質問は少しあいまいです。データを使用して aをpopulateContactList()a にバインドするがあり、このメソッドを別のカスタムのメソッドで使用したい場合 (この場合は、これを実行しないでください)。または、独自のアダプターを使用して、データを連絡先にバインドしますか (この場合は、クエリの結果を独自の で使用します)。CursorContactsSimpleCursorAdaptergetView()AdaptercursorAdapter

AdapterカスタムAdapter拡張のタイプは言いません。Cursorベースの場合Adapter、物事は簡単で、bindViewandを使用newViewしてカーソルデータにアクセスできます(コンストラクターでCursorfromgetContacts()を(スーパークラスに)渡します)。それ以外の場合は、取得した からのデータを の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

    //...
    private ArrayList<String> data;

    public CustomAdapter(Context context, int type, ArrayList<String> elements){
        super(context, type, elements);
        this.data = elements;
    }

    public int getCount() {
        return data.size();  
    }

    @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, parent, false); //<= use parent instead of null
            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();
        }
        //bind the data to the row views
        String contactName = data.get(position);
        holder.contact.setText(contactName);
        // other stuff you might do to build thw row
//...
于 2012-05-11T09:29:04.937 に答える