Скажите, правильно ли я понял проблему.... Вы хотите пометить определенные строки как выбранные, а выбранные строки визуально отображаются с отступом (с другим цветом и полями)?
Вот 2 техники:
1 — Использование StateListDrawable для фона строки:
Если это так, я бы создал файл макета строки списка и установил для свойства «фон» значение StateListDrawable (может быть XML). Это позволит строке переключать визуальные состояния для выбранного и не выбранного.
Атрибут "drawable" StateListDrawable будет представлять собой PNG с 9 патчами, один для невыбранного состояния, которое не включает поля, и один для выбранного... выбранный будет определять поле внутри самого PNG, указав область содержимого/нижняя черная линия не должна полностью простираться до левой стороны PNG, оставляя область, которая является вашим немасштабированным полем.
Ради тех, кто найдет это, Рэдли Маркс только что опубликовал отличный пост о патче 9: http://radleymarx.com/blog/simple-guide-to-9-patch/
С ListViews иногда бывает так, что вы хотите отключить «listSelector» (который представляет собой отдельный объект, отображаемый либо над списком, либо позади) и вместо этого использовать атрибут «duplicateParentState», чтобы позволить самой строке отображать выбор (без списка нужен селектор). Это может предоставить немного больше свободы для творчества, особенно если вы хотите иметь поля переменной ширины для определенных строк или несколько типов строк, которые все выглядят по-разному. Хотя полностью зависит от дизайна.
2 - Использование поля для каждой строки:
Если вы решили, что вам нужно несколько типов цветовых индикаторов и т. д., вам, возможно, придется использовать другой подход, предоставив атрибут поля (который, вероятно, не будет работать сразу)... Это относится к тому, как LayoutParams используются система компоновки. Я пытаюсь вспомнить точные детали, но я думаю, что это связано с различными типами подкласса LayoutParam и свойствами MarginLayoutParam (или его подкласса), например. marginLeft может игнорироваться кодом макета ListView. Вы должны использовать экземпляр AbsListView.LayoutParams, который не включает параметры полей. Один из способов — вложить вашу строку в представление контейнера (подкласс), который допускает поля в своих LayoutParams*. Я уверен, что не стал делать это постороннее вложение, но мне придется покопаться в каком-то коде, чтобы вспомнить лучшее решение.
Вы упоминаете о размещении ImageView и заполнении его цветом. Есть несколько альтернатив, на которые вы могли бы обратить внимание... Наиболее эффективным, вероятно, было бы определить свой собственный класс ListRow и использовать onDraw() для фактического рисования содержимого строки самостоятельно, canvas.draw_xyz() для рисования маленькой цветной вкладки, и рисовать текст и т. д. для остальных, а не строить строку в составном макете. Второй метод с использованием макетов заключается в том, чтобы, например, использовать более легкий ‹View layout_height="match_parent" layout_width="4dip" background="#ffff0000" /›.
* Золотое правило в макетах Android: сложная иерархия пользовательского интерфейса губительна для производительности, особенно с такими вещами, как ListView. Часто этого можно избежать, используя другие вещи: RelativeLayout, drawableTop(и т. д.), изображения с 9 патчами, а не добавляя больше представлений.
Если я неправильно понял, и вышеизложенное слишком просто, пожалуйста, не могли бы вы предоставить более подробную информацию, возможно, диаграмму, показывающую точную часть, которую вам нужно воспроизвести.
person
richardleggett
schedule
20.05.2011