Загрузить изображение контакта в список вместо стандартного? - PullRequest
2 голосов
/ 01 декабря 2011

Я создал список, содержащий мои контакты ...

tab_contact_list.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="fill_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/tab_contact_list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1" />

</LinearLayout>


listview_detail_tab_contact_list.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="fill_parent"
    android:orientation="horizontal" >


    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:src="@drawable/defaultavatar" />

    <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/contact_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="5dp"
            android:text="Who am I"
            android:textAppearance="?android:attr/textAppearanceLarge" />


        <TextView
            android:id="@+id/contact_number"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:text="000000000" />

    </LinearLayout> 

</LinearLayout>


defaultavatar.png в папке для рисования defaultavatar.png


И у меня есть несколько классов:

public class ContactStock {

    private String name;
    private String number;

    public ContactStock(String name, String number) {
        this.name = name;
        this.number = number;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getName() {
        return this.name;
    }

    public String getNumber() {
        return this.number;
    }

}


public class ContactListAdapter extends ArrayAdapter {
    private final Activity activity;
    private final List stocks;

    public ContactListAdapter(Activity activity, List objects) {
        super(activity, R.layout.listview_detail_tab_contact_list, objects);
        this.activity = activity;
        this.stocks = objects;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View rowView = convertView;
        ContactStockView sv = null;
        if (rowView == null) {
            // Get a new instance of the row layout view
            LayoutInflater inflater = activity.getLayoutInflater();
            rowView = inflater.inflate(
                    R.layout.listview_detail_tab_contact_list, null);

            // Hold the view objects in an object,
            // so they don't need to be re-fetched
            sv = new ContactStockView();
            sv.name = (TextView) rowView.findViewById(R.id.contact_name);

            sv.number = (TextView) rowView.findViewById(R.id.contact_number);

            // Cache the view objects in the tag,
            // so they can be re-accessed later
            rowView.setTag(sv);
        } else {
            sv = (ContactStockView) rowView.getTag();
        }
        // Transfer the stock data from the data object
        // to the view objects
        ContactStock currentStock = (ContactStock) stocks.get(position);
        sv.name.setText(currentStock.getName());
        sv.number.setText(currentStock.getNumber());

        // TODO Auto-generated method stub
        return rowView;
    }

    protected static class ContactStockView {
        protected TextView name;
        protected TextView number;
    }
}


У меня есть класс отображения списка:

public class addlistfromcontact extends Activity {
    private ListView lst;
    private List<ContactStock> contactstock;
    private Cursor mCursor;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tab_contact_list);
        lst = (ListView) findViewById(R.id.tab_contact_list);
        contactstock = new ArrayList<ContactStock>();

        mCursor = managedQuery(ContactsContract.Data.CONTENT_URI, null, Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'", null,
                ContactsContract.Data.DISPLAY_NAME + " ASC");
        int number = mCursor.getColumnIndex(Phone.NUMBER);      
        int name = mCursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME);
        while (mCursor.moveToNext()) {
            String phName = mCursor.getString(name);
            String phNumber = mCursor.getString(number);
            contactstock.add(new ContactStock(phName, phNumber));
        }
        lst.setAdapter(new ContactListAdapter(addlistfromcontact.this,
                contactstock));
    }

}


И мой результат выглядит так:

Listview results


Теперь, как мне отобразить картинку каждого контакта вместо defaultavatar.png?

Ответы [ 4 ]

0 голосов
/ 27 августа 2013

Я верю, что вы ошиблись.

long phId=mCursor.getLong(id);

должен быть частью цикла while.

0 голосов
/ 05 апреля 2012

Приведенный выше ответ может привести к ошибке ... Вот 100% рабочий код

Uri uri = Uri.parse(url);
                             Bitmap bitmap = null;
                            try {
                                bitmap = MediaStore.Images.Media.getBitmap(contexts.getContentResolver(), uri);
                            } catch (FileNotFoundException e) {
                                // TODO Auto-generated catch block
                                bitmap = null;
                                e.printStackTrace();
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                                bitmap = null;
                            }


                            if(bitmap != null)
                                friend.setImageURI(uri);
                            else
                                friend.setImageResource(R.drawable.avatar_photo); 

Где ImageView - друг.

0 голосов
/ 23 сентября 2012

сначала вам нужно добавить растровое изображение в класс ContactStock, это сохранит фотографию контакта.

измените конец класса адаптера на следующий код:

        ContactStock currentStock = (ContactStock) stocks.get(position);
        sv.name.setText(currentStock.getName());
        sv.number.setText(currentStock.getNumber());
        sv.image.setImageBitmap(currentStock.getPicture());


        // TODO Auto-generated method stub
        return rowView;
    }

    protected static class ContactStockView {
        protected TextView name;
        protected TextView number;
        protected ImageView image;
    }

к основному заданию (AddlistFromContact) добавьте следующую функцию:

public Bitmap getPhoto(long userId ) {
        Uri photoUri = null;
        ContentResolver cr = this.getContentResolver();
        photoUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, userId);
        Bitmap defaultPhoto = BitmapFactory.decodeResource(getResources(), R.drawable.contacts);
        if (photoUri != null) {
            InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(
                    cr, photoUri);
            if (input != null) {
                return BitmapFactory.decodeStream(input);
            }
        } else {

            return defaultPhoto;
        }

        return defaultPhoto;
    }

теперь все, что вам нужно сделать, это добавить к вашей функции onCreate() эти две строки после того, как вы определили курсор курса:



    int id=mCursor.getColumnIndex(Phone.CONTACT_ID);
    long phId=mCursor.getLong(id);

и вызовите конструктор contactStock следующим образом:

contactstock.add(new ContactStock(phName, phNumber,getPhoto(phId)));

надеюсь, что я помог

0 голосов
/ 04 января 2012

Попробуйте использовать вашу модель для удержания изображения.

public class ContactStock {

    private Bitmap picture;

    // your current code goes here       

    public void setPicture(Bitmap picture) {
        this.picture = picture;
    }

    public Bitmap getPicture() {
        return picture;
    }
}

убедитесь, что вы реализуете метод getPicture () в вашем ArrayAdapter, вы используете там только ваши имя и номер объекта, в вашем XML дляЕсли у вас уже есть изображение, просто добавьте его в ArrayAdapter ... так как же получить растровое изображение?это сработало для меня ...

public Bitmap loadContactPhoto(ContentResolver cr, long id) { 
    Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id); 
    InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri); 
    if (input == null) { 
return null; 
    } 
    return BitmapFactory.decodeStream(input); 
}

Участник StackOverflow "mismissle" разместил это здесь. Как мне загрузить контактную фотографию? спасибо неправильно.Поскольку вы уже можете получить имя и номер контакта, просто потяните за идентификатор, подключите его к этому методу с помощью ContentResolver, который возвращает растровое изображение, которое можно поместить в ваш список!надеюсь, что это помогло.

...