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