В предыдущем посте мы говорили о кастомном адаптере. Мы использовали довольно простой адаптер только с 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, мы имеем:

