android - 我必须使用扩展基本适配器的自定义适配器在 ListView 中显示所有联系人的联系人信息(姓名、号码、图像)

标签 android android-listview baseadapter

我创建了一个ListView,它应该显示联系人-(姓名、号码、图像)。

我检索了姓名和电话号码,但无法显示图像。

我使用了自定义适配器,这里是适配器代码

public class PranzAdapter extends BaseAdapter {

ArrayList<SingleRow> list;
Context c;

PranzAdapter(Context context, ArrayList<SingleRow> listItem){
    c = context;
    list= listItem;
}

@Override
public int getCount() {
    return list.size();
}

@Override
public Object getItem(int position) {
    return list.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View row =  inflater.inflate(R.layout.single_row,null,false);

    TextView name   = (TextView) row.findViewById(R.id.textView1);
    TextView number = (TextView) row.findViewById(R.id.textView2);
    ImageView image = (ImageView) row.findViewById(R.id.imageView);

    SingleRow singleRow = list.get(position);

    name.setText(singleRow.name);
    number.setText(singleRow.number);

 //Error is this, Previously when any contact doesn't have image it pass `null`  

  if (singleRow.image!= null) {
        image.setImageURI(Uri.parse(singleRow.image));
    }
    return row;
 }
}

更新:我没有为联系人图像添加任何默认图像,因此如果任何联系人没有图像,则会抛出NullPointer,因此您可以放置​​默认图像,或者您必须使用 if 条件处理异常。

我可以显示姓名和号码,但检索图像时出现问题。

这是获取联系信息的代码

public class MainActivity extends Activity {

ListView list;

ArrayList<SingleRow> listItem;

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

    list = (ListView) findViewById(R.id.listView);
    listItem = new ArrayList<SingleRow>();

    ContentResolver resolver = getContentResolver();
    Cursor cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

    String id;
    String name;
    String number;
    String image;
    if (cursor.getCount() > 0) {
        while (cursor.moveToNext()) {
            id   = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
            name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));


            if (Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0)
            {
                Cursor pCur = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null);
                while (pCur.moveToNext())
                {
                     number = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                     image = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));

                    SingleRow s = new SingleRow(name,number,image);
                    listItem.add(s);
                }
                pCur.close();

            }
        }
    }
    cursor.close();
    list.setAdapter(new PranzAdapter(this, listItem));
 }
}

这是我用于个人联系的模型类:

public class SingleRow {

String name;
String number;
String image;

//Constructor for Single row
SingleRow (String name,String number,String  image){
    this.name = name;
    this.number = number;
    this.image = image;
    }
}

最佳答案

我猜问题出在这里:

image.setImageURI(Uri.parse(temp.image));

如果您的联系人没有图像,则您正在尝试解析null

我不是 100% 确定,但由于您没有提供任何堆栈跟踪,我猜这就是问题所在。

关于android - 我必须使用扩展基本适配器的自定义适配器在 ListView 中显示所有联系人的联系人信息(姓名、号码、图像),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29764702/

相关文章:

java - android开发人员警报对话框+ ListView 功能

android - 如何在 BaseAdapter Get View 方法扩展的类中显示 Toast

java - 通用图像加载器 : Get ImageView Object From Tap

android - 在回收站 View 中的两个布局之间切换

java - Android 应用程序在模拟器和设备上不断崩溃

android - 从上下文操作栏访问 ListView 项目的文本

android - ListView 未按预期运行

安卓 : Custom DialogFragment so slow to display

android - 多部分实体 POST android

android - 如何在 Android.bp 中添加条件