Статьи

Android ListView: пользовательский адаптер с ImageView

В предыдущем посте мы говорили о кастомном адаптере. Мы использовали довольно простой адаптер только с 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"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    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, мы имеем:

Ссылка: Android ListView: пользовательский адаптер с ImageView от нашего партнера JCG Франческо Аццолы из блога Surviving с Android .