Заполнение списка просмотра изображениями с SD-карты (не заданное количество элементов в списке) - PullRequest
2 голосов
/ 24 февраля 2011

В основном я пытаюсь создать список контактов, подобный тому, который предоставлен Android. При заполнении представления списка элементами с помощью SimpleCursorAdapter вы можете легко получить все имена, которые будут отображаться в R.id.textview каждого элемента:

private void fillData() {
        mCursor = mDbAdapter.fetchAllContacts();
        startManagingCursor(mCursor);
        String[] from = new String[] {DBAdapter.KEY_NAME};
        int[] to = new int[] {R.id.contact_name};
        SimpleCursorAdapter contacts = new SimpleCursorAdapter(this, R.layout.contact_view, mCursor, from, to);
        this.setListAdapter(contacts);
    }

Нечто подобное. Я искал и нашел пример кода как для получения изображений из Интернета, так и для отображения заданного количества изображений в элементах (например, вы знаете, что у вас есть 5 элементов, поэтому вы получаете 5 подходящих изображений). Но я действительно не знаю, с чего бы начать получать изображения со своей SD-карты и отображать их в нужном месте. Изображения названы в соответствии с идентификатором контакта, поэтому у меня есть возможность назвать нужное изображение.

Толчок в правильном направлении был бы очень признателен, спасибо!

РЕДАКТИРОВАТЬ: @ Джефф Гилфелт дал отличный ответ, но я пошел вперед и слишком рано заговорил, сказав, что я могу выяснить остальное самостоятельно ... ха-ха. У меня есть изображение по умолчанию, объявленное в xml для контактов, как это делает Android. Когда я реализую новый адаптер, он как бы сжимает элементы в ничто, я полагаю, потому что он находит пустое растровое изображение в этом месте. Поэтому я сделал следующее:

@Override
public void setViewImage(ImageView v, String id) {
    File root = Environment.getExternalStorageDirectory();
    File path = new File(root, "path/images/thumbs/"+id+".jpg");

    if(path.exists()) {
        Bitmap bitmap = BitmapStatic.getThumb(id);
        v.setImageBitmap(bitmap);
    }
    else {
        super.setViewImage(v, id);
    }
}

Но это тоже не помогает. Есть идеи?

РЕДАКТИРОВАТЬ2: Выяснил вышеупомянутую проблему. Просто идите так:

    else {
        Resources res = mContext.getResources();
        Drawable drawable = res.getDrawable(R.drawable.default);
        v.setImageDrawable(drawable);
    }

Надеюсь, это поможет другим! Помните, что для этого решения вам нужно будет добавить член Context var и строку mContext = context в конструкторе.

Ответы [ 4 ]

2 голосов
/ 24 февраля 2011

Создайте подкласс SimpleCursorAdaptor и переопределите метод setViewImage таким образом, чтобы он создавал путь к соответствующему файлу на SD-карте из идентификатора, который вы передали ему, затем используйте BitmapFactory.decodeFile для создания растрового изображения, которое вы используете для представления изображения, которое вы привязаны к:

public class MySimpleCursorAdapter extends SimpleCursorAdapter {

    public MySimpleCursorAdapter(Context context, int layout, Cursor c,
        String[] from, int[] to) {
        super(context, layout, c, from, to);
    }

    @Override
    public void setViewImage(ImageView v, String id) {

        String path = "/path/to/sd/card/" + id + ".png";
        Bitmap b = BitmapFactory.decodeFile(path);
        v.setImageBitmap(b);

    }

}

Затем добавьте свой идентификатор контакта из курсора и идентификатор представления вашего ImageView в массивы to / from, которые вы передаете в адаптер. Пример:

private void fillData() {
    mCursor = mDbAdapter.fetchAllContacts();
    startManagingCursor(mCursor);
    String[] from = new String[] {DBAdapter.KEY_NAME, DBAdapter.ID};
    int[] to = new int[] {R.id.contact_name, R.id.contact_image};
    MySimpleCursorAdapter contacts = 
        new MySimpleCursorAdapter(this, R.layout.contact_view, mCursor, from, to);
    this.setListAdapter(contacts);
}
0 голосов
/ 11 июля 2012

Вам не нужно создавать подкласс SimpleCursorAdapter, просто создайте ViewBinder, который обрабатывает настройку вашего изображения для каждой строки.

ViewBinder.setViewValue будет вызываться для всех View s в вашей строке (как указано в xml макета), поэтому убедитесь, что вы возвращаете false для любого представления, которое не является экземпляром ImageView.

ViewBinder viewBinder = new ViewBinder(){

    public boolean setViewValue(View view, Cursor cursor, int columnIndex) {

        if (view instanceof ImageView){

            ImageView imageView = (ImageView) view;

            String imageFilename = cursor.getString(columnIndex);
            imageView.setImageURI(imageFilename);

            return true;
        } 

        return false;
    }

};
cursorAdapter.setViewBinder(viewBinder);
0 голосов
/ 24 февраля 2011

Вы должны прочитать главу external storage в руководстве по разработке Android. Вызвав getExternalFilesDir (), вы получите путь к файлу на вашей SD-карте.

В качестве стратегии, если вы перейдете к папке, содержащей изображения, и просто передадите ID своего контакта, чтобы найти файл, вы можете загрузить его в структуру данных.

Затем вы можете создать собственный адаптер, передавая структуру данных, содержащую ваши изображения. Это приведет к тому, что ваш ListView будет содержать только изображения ваших контактов.

Это просто для того, чтобы дать вам старт!

0 голосов
/ 24 февраля 2011

Прочтите этот урок http://developer.android.com/guide/topics/data/data-storage.html

и этот пост http://www.brighthub.com/mobile/google-android/articles/64048.aspx

У вас есть двухмерный массив, первый элемент которого содержит имя контакта, а второй - изображение. После прочтенияизображения в растровое изображение, сохраните растровое изображение в списке контактов.Имейте пользовательский arrayAdapter, который содержит textView и imageView в качестве элементов строки, установите имя контакта и изображение в getView () адаптера массива.См. Этот пост для пользовательских списков http://www.androidpeople.com/android-custom-listview-tutorial-example/

Это должно помочь вам начать работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...