В предыдущем посте мы говорили о кастомном адаптере. Мы использовали довольно простой адаптер только с TextView . Мы хотим расширить идею, описанную ранее, и представить изображение для каждой планеты. Чтобы сделать это, мы должны изменить макет и другие части кода, чтобы обработать щелчок пользователем на каждом элементе. Мы хотим, чтобы каждая строка в ListView выглядела так:
Первое, что мы должны сделать, это изменить макет и использовать RelativeLayout вместо простого LinearLayout. Наш макет выглядит так:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
<? xml version = "1.0" encoding = "utf-8" ?> android:layout_width = "match_parent" android:layout_height = "wrap_content" > < ImageView android:id = "@+id/img" android:layout_width = "wrap_content" android:layout_height = "match_parent" android:layout_alignParentLeft = "true" /> < TextView android:id = "@+id/name" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_alignTop = "@+id/img" android:layout_toRightOf = "@+id/img" android:textStyle = "bold" /> < TextView android:id = "@+id/dist" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_below = "@id/name" android:layout_gravity = "center" android:layout_marginTop = "2dip" android:layout_toRightOf = "@id/img" android:gravity = "right" android:textSize = "8dp" android:textStyle = "italic" /> </ RelativeLayout > |
Макет, показанный выше, довольно тривиален, и нам не нужно его объяснять. Затем мы должны изменить пользовательский адаптер для обработки изображений и класса держателя . Держатель класса становится:
1
2
3
4
5
|
private static class PlanetHolder { public TextView planetNameView; public TextView distView; public ImageView img; } |
и адаптер становится:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
public View getView( int position, View convertView, ViewGroup parent) { View v = convertView; PlanetHolder holder = new PlanetHolder(); // First let's verify the convertView is not null if (convertView == null ) { // This a new view we inflate the new layout LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = inflater.inflate(R.layout.img_row_layout, null ); // Now we can fill the layout with the right values TextView tv = (TextView) v.findViewById(R.id.name); TextView distView = (TextView) v.findViewById(R.id.dist); ImageView img = (ImageView) v.findViewById(R.id.img); holder.planetNameView = tv; holder.distView = distView; holder.img = img; v.setTag(holder); } else holder = (PlanetHolder) v.getTag(); System.out.println( "Position [" +position+ "]" ); Planet p = planetList.get(position); holder.planetNameView.setText(p.getName()); holder.distView.setText( "" + p.getDistance()); holder.img.setImageResource(p.getIdImg()); return v; } |
Таким образом, для каждой строки в ListView мы устанавливаем не только имя планеты в TextView, но также и ImageView с изображением относительно планеты. Если мы запустим приложение, у нас будет что-то вроде этого:
Ну, я не использовал правильные изображения для планет, это просто способ показать вам, как использовать изображения !!!. Вы должны изменить размер и улучшить изображения в вашем приложении!
Теперь, если вы нажмете на элемент, вы получите ClassCastException . Почему? Ну, вы пытаетесь привести внутри метода onItemClick RelativeLayout к TextView, и это невозможно.
Обрабатывать клик пользователя
Если вы хотите обработать щелчок пользователя на каждом элементе, вам нужно изменить код внутри метода lv.setOnItemClickListener . Прежде всего мы должны найти позицию элемента, выбранную пользователем, и мы можем сделать это или с помощью параметра position в public void onItemClick (AdapterView <?> ParentAdapter, View view, int position, long id) или мы можем запросить ТАК, чтобы найти правильную позицию таким образом:
1
|
int pos = lv.getPositionForView(view); |
Таким образом, мы знаем положение элемента, по которому щелкнул пользователь. Как только мы узнаем это, действительно просто извлечь информацию, потому что, имея ссылку на массив элементов, мы просто делаем:
1
|
Planet planet = aAdpt.getItem(pos); |
Поэтому, когда пользователь нажимает на элемент внутри ListView, мы имеем: