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
Комментариев нет:
Отправить комментарий