четверг, 7 октября 2010 г.

Список с картинками



Для создания такого списка необходимо добавить такой код:
IconifiedTextListAdapter itla = new IconifiedTextListAdapter(this);
// Добавление позиций
itla.addItem(new IconifiedText("Surf Web", getResources().getDrawable(R.drawable.favicon)));
itla.addItem(new IconifiedText("Report Bug", getResources().getDrawable(R.drawable.bug)));
itla.addItem(new IconifiedText("Speak Spanish", getResources().getDrawable(R.drawable.locale)));
itla.addItem(new IconifiedText(
"Vidoop", getResources().getDrawable(R.drawable.vidoop)));
// Отображение списка
setListAdapter(itla);
В этом фрагменте используется нестандартный адаптер и объекты класса IconifiedText, этот класс содержит простой конструктор и внутренние поля: строку для названия, картинку и логическую переменную. Кроме того он реализует интерфейс  Comparable, переопределяя метод compareTo, причем сравнение происходит по тесту  в записи. Методы у этого класса:
  • isSelectable – возвращает истину если данная запись листа выбрана
  • setSelectable – позволяет задать выбранную запись в листе
  • getText – получение текста из записи
  • setText- установка текста для записи
  • setIcon- установка картинки для записи
  • getIcon – получение картинки из записи
Весь класс выглядит так:
public class IconifiedText implements Comparable{
private String mText = "";
private Drawable mIcon;
private boolean mSelectable = true;
public IconifiedText(String text, Drawable bullet) {
mIcon = bullet;
mText = text;
}
public boolean isSelectable() {
return mSelectable;
}
public void setSelectable(boolean selectable) {
mSelectable = selectable;
}
public String getText() {
return mText;
}
public void setText(String text) {
mText = text;
}
public void setIcon(Drawable icon) {
mIcon = icon;
}
public Drawable getIcon() {
return mIcon;
}
@Override
public int compareTo(IconifiedText other) {
if(this.mText != null)
return this.mText.compareTo(other.getText());
else
throw new IllegalArgumentException();
}
}
Затем необходимо создать класс адаптера. Он основан на списке записей IconifiedText, который вы можете заполнить значениями с помощью метода add и реализует базовые методы работы со списком(получение  записи по порядковому номеру, организация проверки выбрана ли запись с заданным индексом и тд). Так же в этом адаптере придеться перегрузить метод получения записи getView, для решения поставленной задачи.  Адаптер содержит порядка 50-ти строк кода, не больше:
public class IconifiedTextListAdapter extends BaseAdapter {
private Context mContext;// Сохранение для создания вьеверов
// список записей, которые храняться в листе
private List mItems = new ArrayList();
// Конструктор с одним параметром - контестом
public IconifiedTextListAdapter(Context context) {
mContext = context;
}
// методы по добавлении записей в лист
public void addItem(IconifiedText it) { mItems.add(it); }// добавить одну
public void setListItems(List lit) { mItems = lit; }// добавить список
// получить количество записей
public int getCount() { return mItems.size(); }
получить выбранную запись
public Object getItem(int position) { return mItems.get(position); }
public boolean areAllItemsSelectable() { return false; }
Проверить, выбрана ли запись с заданным индексом
public boolean isSelectable(int position) {
try{
return mItems.get(position).isSelectable();
}catch (IndexOutOfBoundsException aioobe){
return super.isSelectable(position);
}
}
// получить идентификатор выбранной записи
public long getItemId(int position) {
return position;
}
/** @param convertView – старый вьевер, который необходимо обновить
* @returns Вьевер IconifiedTextView который содержит IconifiedText, будет описан далее */
public View getView(int position, View convertView, ViewGroup parent) {
IconifiedTextView btv;
if (convertView == null) {
btv = new IconifiedTextView(mContext, mItems.get(position));
} else { // Повторное использование или перезапись вьевера
btv = (IconifiedTextView) convertView;
btv.setText(mItems.get(position).getText());// установка текста
btv.setIcon(mItems.get(position).getIcon());// установка картинки
}
return btv;// вернуть новый вьювер
}
}
Теперь необходимо описать класс IconifiedTextView, который используется в адаптере, он наследуется от LinearLayout. Вьеверы в Андроиде могут содержать другие вьюверы и тд. IconifiedTextView содержит два вьевера: ImageView и TextView и имеет свой собственный конструктор:
public class IconifiedTextView extends LinearLayout {
private TextView mText;
private ImageView mIcon;
public IconifiedTextView(Context context, IconifiedText aIconifiedText) {
super(context);
this.setOrientation(HORIZONTAL);
mIcon = new ImageView(context);
mIcon.setImageDrawable(aIconifiedText.getIcon());
// left, top, right, bottom
mIcon.setPadding(0, 2, 5, 0); // 5px to the right
/* Добавление картинки
addView(mIcon,  new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
mText = new TextView(context);
mText.setText(aIconifiedText.getText());
/* Добавление текста */
addView(mText, new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
}
// Метод установки текста
public void setText(String words) {
mText.setText(words);
}
// Метод установки картинки
public void setIcon(Drawable bullet) {
mIcon.setImageDrawable(bullet);
}
}
}

Взято переведено и модифицировано с www.anddev.org

Комментариев нет:

Отправить комментарий