Статьи

Стиль строки фона для списка рассылки Android: закругленный угол, альтернативный цвет

Один аспект, который мы не рассматривали в предыдущих постах, — это то, как мы можем применить стиль или фон к элементам Listview (или строке). Мы можем настроить внешний вид ListView так, как нам нравится, например, можно использовать в качестве фона закругленный угол , альтернативный цвет и так далее. К настоящему моменту мы рассматривали только пользовательский адаптер без учета того, как мы можем настроить внешний вид каждого элемента в списке .

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

ListView с закругленным углом

Предположим, мы хотим создать закругленный угол для каждого элемента. Как мы можем это сделать? … Нам нужно создать некоторые ресурсы для рисования и применить их к каждому элементу. Как вы уже знаете, мы должны создать собственный адаптер для реализации этого поведения. В этом посте мы не хотим тратить слишком много слов об адаптерах, потому что мы описали их здесь и здесь .

Как мы сказали, первое, что нам нужно, это ресурс, который можно извлечь. Как вы, возможно, уже знаете, это мощная функция Android, поскольку она позволяет нам создавать геометрические фигуры в стиле XML. Мы должны указать некоторую информацию для создания этой фигуры:

  • размер и цвет границы
  • цвет фона (в нашем случае сплошной цвет)
  • углы

Нам нужно создать файл XML в каталоге res / drawable . Давайте назовем этот файл rounded_corners.xml . Этот файл содержит определение формы. Форма — это геометрическая фигура, которая описывается другими тегами:

  • обводка — линия обводки для фигуры (witdh, color, dashWidth и dashGap)
  • сплошной — сплошной цвет, который заполняет форму
  • углы — радиус и т. д

Итак, файл roundnded_corners.xml выглядит следующим образом:

01
02
03
04
05
06
07
08
09
10
11
<?xml version="1.0" encoding="utf-8"?>
 
    <solid android:color="#00FF00"/>
 
    <corners android:radius="5dp" />
 
    <padding android:left="3dp" android:top="3dp" android:right="3dp" android:bottom="3dp" />
 
    <stroke android:width="3dp" android:color="#00CC00"/>
</shape>

Как только мы создадим нашу форму, нам нужно применить ее к элементам. Чтобы сделать это, мы должны создать еще один XML-файл, который описывает, как мы применяем эту форму. В этом случае мы используем селектор тегов XML , чтобы указать, когда и как применять форму. Чтобы указать, когда применять форму, мы используем статус . Мы указываем применять эту форму, когда:

  • статус = включить
  • статус = выбранный
  • статус = нажата

Итак, наш файл ( listview_selector.xml ) выглядит так:

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@drawable/rounded_corner" android:state_enabled="true"/>
 
    <item android:drawable="@drawable/rounded_corner" android:state_pressed="true"/>
 
    <item android:drawable="@drawable/rounded_corner" android:state_focused="true"/>
 
</selector>

Теперь мы определили наш ресурс, нам просто нужно указать, чтобы применить его в нашем адаптере следующим образом:

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
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.row_layout, null);
        // Now we can fill the layout with the right values
        TextView tv = (TextView) v.findViewById(R.id.name);
 
        holder.planetNameView = tv;
 
        v.setTag(holder);
 
        v.setBackgroundResource(R.drawable.rounded_corner);
    }
    else
        holder = (PlanetHolder) v.getTag();
 
    Planet p = planetList.get(position);
    holder.planetNameView.setText(p.getName());
 
    return v;
}

Если мы запустим приложение, у нас есть:

ListView с альтернативным цветом

Как мы описали выше, если мы хотим изменить внешний вид каждой строки внутри ListView, мы просто изменим ресурс и можем настроить его внешний вид.

Например, мы можем предположить, что мы хотим чередовать цвет строки. В этом случае нам нужно создать два ресурса для рисования по одному для каждого фона, вот так:

even_row.xml

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
 
    <solid android:color="#A0A0A0"/>
 
    <padding android:left="3dp" android:top="3dp" android:right="3dp" android:bottom="3dp" />
 
    <stroke android:width="1dp" android:color="#00CC00"/>
</shape>

odd_row.xml

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
 
    <solid android:color="#F0F0F0"/>
 
    <padding android:left="3dp" android:top="3dp" android:right="3dp" android:bottom="3dp" />
 
    <stroke android:width="1dp" android:color="#00CC00"/>
</shape>

Более того, нам нужны два селектора, которые используют доступные ресурсы, например

listview_selector_even.xml

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@drawable/even_row" android:state_enabled="true"/>
 
    <item android:drawable="@drawable/even_row" android:state_pressed="true"/>
 
    <item android:drawable="@drawable/even_row" android:state_focused="true"/>
 
</selector>

listview_selector_odd.xml

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@drawable/odd_row" android:state_enabled="true"/>
 
    <item android:drawable="@drawable/odd_row" android:state_pressed="true"/>
 
    <item android:drawable="@drawable/odd_row" android:state_focused="true"/>
 
</selector>

И наконец мы применяем их внутри нашего специального адаптера:

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
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.row_layout, null);
        // Now we can fill the layout with the right values
        TextView tv = (TextView) v.findViewById(R.id.name);
 
        holder.planetNameView = tv;
 
        v.setTag(holder);
 
        if ( position % 2 == 0)
          v.setBackgroundResource(R.drawable.listview_selector_even);
        else
            v.setBackgroundResource(R.drawable.listview_selector_odd);
    }
    else
        holder = (PlanetHolder) v.getTag();
 
    Planet p = planetList.get(position);
    holder.planetNameView.setText(p.getName());
 
    return v;
}

Запустив приложение мы имеем:

Исходный код @ github