1

我创建了一个自定义适配器和自定义列表项。我最初使用的是一个简单的列表项,只是填充了名称或编号。但是,现在我想在每个列表项中同时显示姓名和电话号码。当我现在在自动完成文本中输入内容时,它不会填充任何内容。我做了一些错误测试,似乎它甚至没有调用被覆盖的 getView() 方法。我似乎无法弄清楚为什么这不起作用。

另外,是的,我在清单中添加了 READ_CONTACTS 权限。

MainActivity.java

package com.sncrmck.autocompletetest;

import java.util.ArrayList;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.widget.AutoCompleteTextView;

import com.sncrmck.adapter.ContactAdapter;
import com.sncrmck.obj.SimpleContact.SimpleContact;

public class MainActivity extends Activity {

    AutoCompleteTextView acTextField;
    private ContactAdapter adapter;

    public ArrayList<SimpleContact> contactList = new ArrayList<SimpleContact>();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ContentResolver resolver = getContentResolver();

        acTextField = (AutoCompleteTextView) findViewById(R.id.autoComplete);

        Uri contacts = Uri.parse("content://icc/adn");

        Cursor cursor = resolver.query(contacts, null, null, null, null);

        if (cursor.moveToFirst()) {

            String contactName;
            String phoneNumber;

            int nameColumn = cursor.getColumnIndex("name");
            int phoneColumn = cursor.getColumnIndex("number");


            do {

            contactName = cursor.getString(nameColumn);
            phoneNumber = cursor.getString(phoneColumn);
                if((contactName != " " || contactName != null) && (phoneNumber!= " " ||phoneNumber!= null))
                {
                SimpleContact sc = new SimpleContact(contactName, phoneNumber);
                contactList.add(sc);
                }

            } while (cursor.moveToNext());

        }
        adapter = new ContactAdapter(this, R.layout.grid_item, contactList);
        acTextField.setAdapter(adapter);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

CustomAdapter.java

    package com.sncrmck.adapter;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import android.widget.Toast;

import com.sncrmck.autocompletetest.R;
import com.sncrmck.obj.SimpleContact.SimpleContact;

public class ContactAdapter extends ArrayAdapter<SimpleContact> {

    private ArrayList<SimpleContact> entries;
    private Activity activity;


     public ContactAdapter(Activity a, int textViewResourceId, ArrayList<SimpleContact> entries){
         super(a, textViewResourceId, entries);
         this.entries = entries;
         this.activity = a;
         Toast.makeText(getContext(), "Constructor", Toast.LENGTH_SHORT).show();

     }

     public static class ViewHolder{
            public TextView item1;
            public TextView item2;

        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Toast.makeText(getContext(), "Get View", Toast.LENGTH_SHORT).show();
            View v = convertView;
            ViewHolder holder;
            if (v == null) {
                LayoutInflater vi =
                    (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.grid_item, null);
                holder = new ViewHolder();
                holder.item1 = (TextView) v.findViewById(R.id.big);
                holder.item2 = (TextView) v.findViewById(R.id.small);;

            }

            else
                holder=(ViewHolder)v.getTag();

            final SimpleContact contactInfo = entries.get(position);
            if (contactInfo != null) {
                holder.item1.setText(contactInfo.getContactName());
                holder.item2.setText(contactInfo.getContactNumber());

            }
            return v;
        }

    }

这是我传递给 ContactAdapter 的 SimpleContact 对象

package com.sncrmck.obj.SimpleContact;

public class SimpleContact {

    private String contactName;
    private String contactNumber;

    public SimpleContact(String string, String string2) {
        this.contactName = string;
        this.contactNumber = string2;
    }

    public String getContactName() { return contactName; }

    public void set(String contactName) { this.contactName= contactName; }

    public String getContactNumber() { return contactNumber; }

    public void setcustomSmall(String contactNumber) { this.contactNumber = contactNumber; }
    }

最后,这是我的自定义列表项 - grid_item.xml

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

        <TextView 
            android:textSize="24dp" 
            android:id="@+id/big"
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"/>

        <TextView 
            android:textSize="24dip" 
            android:id="@+id/small"
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"/>

</LinearLayout>
4

1 回答 1

0

您需要覆盖自定义适配器的 getFilter() 方法

还实现一个自定义过滤器并覆盖其中的方法。

看到这个类似的问题

我在工作中没有可用的代码,所以如果今晚有机会,我会编辑答案。

于 2013-05-09T05:40:12.057 回答