Изображение в ListView

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
Аватара пользователя
Dedg
Сообщения: 10
Зарегистрирован: 01 апр 2012, 16:56
Контактная информация:

Изображение в ListView

Сообщение Dedg » 01 апр 2012, 17:30

Добрый день. Помогите решить проблему. Имеется база, в которой есть 4 столбца:
"_id"
"fio" - фио;
"photo" - имя картинки, типа image.jpg;
"section";
Все картинки хранятся в проекте в каталоге assets.
Задача состоит в том, что нужно сформировать список, в каждом элементе которого будет картинка и текст с "fio";

Код: Выделить всё

package com.prepods;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import by.idev.android.ownsqlitedb.dbhelper.ExternalDbOpenHelper;

public class list_zapolnenie extends Activity {
	private static final String DB_NAME = "new6.sqlite";
	private static final String TABLE_PREPOD = "teacher";
	private static final String PREPOD_ID = "_id";
	private static final String PREPOD_FIO = "fio";
	private static final String PREPOD_PHOTO = "photo";
        private static final String PREPOD_SECTION = "section";
	private SQLiteDatabase database;


	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

                if (this.getIntent().getExtras() != null) {
			Bundle bundle = this.getIntent().getExtras();
			String sekciya = bundle.getString("sekciya");
			setContentView(R.layout.list);
	
			ExternalDbOpenHelper dbOpenHelper = new ExternalDbOpenHelper(this,
					DB_NAME);
			database = dbOpenHelper.openDataBase();



			final String fio = "fio";
			final String photo = "photo";
			final String ayditoriya = "ayditoriya";
			final String stat = "stat";
			ListView lvSimple;

			ArrayList<Map<String, Object>> data = new ArrayList<Map<String, Object>>();

			String[] columns = { PREPOD_ID + ", " + PREPOD_FIO + ", "
					+ PREPOD_PHOTO};
			String where = PREPOD_SECTION + "=?";
			String[] args = {sekciya};

			Cursor friendCursor = database.query(TABLE_PREPOD, columns, where,
					args, null, null, PREPOD_FIO);

			friendCursor.moveToFirst();

			Map<String, Object> m;
			if (!friendCursor.isAfterLast()) {
				do {
					m = new HashMap<String, Object>();
                                        m.put(fio, friendCursor.getString(1));
					try {
						InputStream bitmap = getAssets().open(friendCursor.getString(2));
						Bitmap myBitmap = BitmapFactory.decodeStream(bitmap);
						m.put(photo, myBitmap);
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
                                        data.add(m);
				} while (friendCursor.moveToNext());
			}

			friendCursor.close();

			String[] from = {fio, photo};
			int[] to = {R.id.label, R.id.foto};
			SimpleAdapter sAdapter = new SimpleAdapter(this, data,
					R.layout.list_item, from, to);

			lvSimple = (ListView) findViewById(R.id.list);
			lvSimple.setAdapter(sAdapter);

			database.close();

	}

}
Но при такой реализации выводит только ФИО, а картинку нет... не знаю что еще делать

Аватара пользователя
Dedg
Сообщения: 10
Зарегистрирован: 01 апр 2012, 16:56
Контактная информация:

Re: Изображение в ListView

Сообщение Dedg » 01 апр 2012, 21:59

и еще один вопрос возник. а можно ли как-то переприсвоить номер позиции элементам списка? чтоб было не 1,2,3.... а по ИД с базы

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Изображение в ListView

Сообщение damager82 » 02 апр 2012, 13:22

Dedg писал(а):Но при такой реализации выводит только ФИО, а картинку нет... не знаю что еще делать
SimpleAdapter ждет от вас id картинки в папке drawable, либо Uri. С Bitmap он работать не умеет. Но всегда можно использовать ViewBinder и самому вставить изображение в ImageView методом setImageBitmap.

Это уроки 48-50, там я очень подробно расписываю работу с SimpleAdapter.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Изображение в ListView

Сообщение damager82 » 02 апр 2012, 13:23

Dedg писал(а):и еще один вопрос возник. а можно ли как-то переприсвоить номер позиции элементам списка? чтоб было не 1,2,3.... а по ИД с базы
Чтобы по id базы, надо использовать SimpleCursorAdapter. Тогда id записи в списке будет равен значению столбца _id из таблицы базы.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
Dedg
Сообщения: 10
Зарегистрирован: 01 апр 2012, 16:56
Контактная информация:

Re: Изображение в ListView

Сообщение Dedg » 02 апр 2012, 18:37

damager82 писал(а):
Dedg писал(а):и еще один вопрос возник. а можно ли как-то переприсвоить номер позиции элементам списка? чтоб было не 1,2,3.... а по ИД с базы
Чтобы по id базы, надо использовать SimpleCursorAdapter. Тогда id записи в списке будет равен значению столбца _id из таблицы базы.
damager82 писал(а):
Dedg писал(а):Но при такой реализации выводит только ФИО, а картинку нет... не знаю что еще делать
SimpleAdapter ждет от вас id картинки в папке drawable, либо Uri. С Bitmap он работать не умеет. Но всегда можно использовать ViewBinder и самому вставить изображение в ImageView методом setImageBitmap.

Это уроки 48-50, там я очень подробно расписываю работу с SimpleAdapter.
небольшое уточнение, сейчас же у меня используется SimpleCursorAdapter... а с картинкой все те же проблемы
мне бы пример кода где картинка вставляется как у меня, тогда б разобрался думаю :)

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Изображение в ListView

Сообщение damager82 » 04 апр 2012, 10:54

Нужен еще пример или разобрались?
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
Dedg
Сообщения: 10
Зарегистрирован: 01 апр 2012, 16:56
Контактная информация:

Re: Изображение в ListView

Сообщение Dedg » 04 апр 2012, 11:48

damager82 писал(а):Нужен еще пример или разобрались?
все еще нужен, я пока пропустил это в своей программе и начал дальше делать. но картинки до сих пор нужно вставить

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Изображение в ListView

Сообщение damager82 » 04 апр 2012, 12:29

В таблице БД есть поле, в котором находится имя файла для отображения в ImageView.
Используем SimpleCursorAdapter. В массивах from и to это поле сопоставлено с ImageView.

Пример SimpleCursorAdapter.ViewBinder, который отобразит картинку из assets в ImageView:

Код: Выделить всё

	ViewBinder myVB = new ViewBinder() {
		public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
			if (view.getId() == R.id.foto) {
				ImageView iv = (ImageView) view;
				try {
					Bitmap bm = BitmapFactory.decodeStream(getAssets().open(cursor.getString(columnIndex)));
					iv.setImageBitmap(bm);
				} catch (IOException e) {
					e.printStackTrace();
				}
				return true;
			}
			return false;
		}
	};
Он читает из БД имя файла, вытаскивает файл из assets, создает Bitmap и передает его в ImageView.

Что такое ViewBinder и как его использовать, можно глянуть в уроке 50.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
Dedg
Сообщения: 10
Зарегистрирован: 01 апр 2012, 16:56
Контактная информация:

Re: Изображение в ListView

Сообщение Dedg » 04 апр 2012, 13:08

damager82 писал(а):В таблице БД есть поле, в котором находится имя файла для отображения в ImageView.
Используем SimpleCursorAdapter. В массивах from и to это поле сопоставлено с ImageView.

Пример SimpleCursorAdapter.ViewBinder, который отобразит картинку из assets в ImageView:

Код: Выделить всё

	ViewBinder myVB = new ViewBinder() {
		public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
			if (view.getId() == R.id.foto) {
				ImageView iv = (ImageView) view;
				try {
					Bitmap bm = BitmapFactory.decodeStream(getAssets().open(cursor.getString(columnIndex)));
					iv.setImageBitmap(bm);
				} catch (IOException e) {
					e.printStackTrace();
				}
				return true;
			}
			return false;
		}
	};
Он читает из БД имя файла, вытаскивает файл из assets, создает Bitmap и передает его в ImageView.

Что такое ViewBinder и как его использовать, можно глянуть в уроке 50.
Все вышло, работает как нужно, спасибо большое :)

Евгений27
Сообщения: 5
Зарегистрирован: 27 июн 2015, 12:26

Re: Изображение в ListView

Сообщение Евгений27 » 29 июн 2015, 20:41

damager82 писал(а):В таблице БД есть поле, в котором находится имя файла для отображения в ImageView.
Используем SimpleCursorAdapter. В массивах from и to это поле сопоставлено с ImageView.

Пример SimpleCursorAdapter.ViewBinder, который отобразит картинку из assets в ImageView:

Код: Выделить всё

	ViewBinder myVB = new ViewBinder() {
		public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
			if (view.getId() == R.id.foto) {
				ImageView iv = (ImageView) view;
				try {
					Bitmap bm = BitmapFactory.decodeStream(getAssets().open(cursor.getString(columnIndex)));
					iv.setImageBitmap(bm);
				} catch (IOException e) {
					e.printStackTrace();
				}
				return true;
			}
			return false;
		}
	};
Он читает из БД имя файла, вытаскивает файл из assets, создает Bitmap и передает его в ImageView.

Что такое ViewBinder и как его использовать, можно глянуть в уроке 50.
Здравствуйте,у меня схожая проблема,только у меня не список листвью,а страница на которую загружаеться текст с базы,хочу добавить и картинки,то есть текст а под ним картинка,картинки лежат в Assets,ссылки на картинки лежат в базе в виде name_image.png,помогите пожалуйста реализовать эту затею...

Ответить