Как установить фоновое изображение для каждого элемента ListView в Android? - PullRequest
4 голосов
/ 16 февраля 2010
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:padding="6dip">
    <ImageView
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_marginRight="6dip"
        android:src="@drawable/icon" />
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="0dip"
        android:layout_weight="1"
        android:layout_height="fill_parent">
        <TextView
            android:id="@+id/toptext"
            android:layout_width="fill_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
            android:gravity="center_vertical"
            android:textStyle="bold"
        />
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
            android:id="@+id/bottomtext"
            android:singleLine="false"
        />
    </LinearLayout>
</LinearLayout>

Это моя текущая строка. Если бы я создал .JPEG и хотел бы, чтобы это было для каждого элемента ... как бы я изменил этот XML-файл? Где бы я положил изображение? В активах?

Ответы [ 2 ]

3 голосов
/ 16 февраля 2010

Если вы хотите иметь отдельные фоны для каждого элемента списка, вы должны объявить свой собственный Адаптер.

Получите его из BaseAdapter, и наиболее важной частью для реализации является метод getView(int, View, ViewGroup).

Вы должны понимать, как Android повторно использует уже существующие элементы представления элемента списка при прокрутке списка. Это означает, что в любой момент времени будет генерироваться столько раз, сколько можно увидеть на экране одновременно.

Эта оптимальная стратегия не генерации слишком большого количества представлений приводит к проблеме, заключающейся в том, что вам придется устанавливать фон для каждого элемента списка в соответствии с их положением, которое необходимо в данный момент при вызове getView. Если вы попытаетесь установить фон статически только при генерации представления, он снова появится, возможно, прикрепленный к неправильному элементу.

Метод getView либо возвращает "convertView" в качестве второго параметра, либо не (ноль). Если ваш метод вызывается с параметром convertView, установленным на что-то, это означает: «повторно используйте это представление для элемента, требуемого прямо сейчас».

Техника, используемая здесь, хорошо описана в демоверсиях API (раздел Списки), и для этого также есть видеоблог.

Вот как это можно сделать:

public class MyAdapter extends BaseAdapter {

    public View getView(int position, View convertView, ViewGroup parent) {
        // position is the element's id to use
        // convertView is either null -> create a new view for this element!
        //                or not null -> re-use this given view for element!
        // parent is the listview all the elements are in


        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.your_layout, null);

            // here you must do whatever is needed to populate the elements of your
            // list element layout
            ...
        } else {
            // re-use the given convert view

            // here you must set all the elements to the required values
        }

        // your drawable here for this element 
        convertView.setBackground( ... );

        // maybe here's more to do with the view
        return convertView;
    }
}

Вот и все. Если есть только несколько фоновых рисунков, я бы их тоже кешировал, чтобы вам не приходилось читать ресурсы снова и снова!

Веселись!

0 голосов
/ 16 февраля 2010

Хотите ли вы представление списка, в котором у каждой строки был свой фон, как показано ниже?

alt text

В вашем коде вы, скорее всего, установили бы ListAdapter для представления. Ряд адаптеров, которые вы можете создать, принимают в качестве макета или аргумента представления. Вам просто нужно установить свойство android: background для представления, на которое вы указываете.

Например, у меня может быть ArrayAdapter , созданный так:

new ArrayAdapter<String>(context, R.layout.item, R.id.itemName);

Конечно, я использую ListView setAdapter с этим адаптером. В моем файле item.xml я могу определить текстовое представление itemName следующим образом:

<TextView android:id="@+id/itemName" android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:text="Test view" android:background="@drawable/add"/>

Однако я не думаю, что у всех типов ListAdapter есть конструктор с этой функцией. Проверьте документацию для типа ListAdapter , который вы используете. Если вы используете один без этого конструктора, я думаю, вам, возможно, придется разделить адаптер на подклассы и переопределить getView адаптера, чтобы увеличить ваш взгляд из вашего файла XML.

У меня есть изображение add.png в каждой из res / drawable папок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...