410013796724260
• Webmoney
R335386147728
Z369087728698
Настройка интерфейса ListViewДанная статья продолжает описание прокручиваемого списка ListView. В предыдущей статье в примерах были использованы системные разметки компонента simple_list_item_1 и simple_list_item_checked. Использование системной разметки хорошо тем, что нет необходимости разрабатывать layout компонента ListView. Однако, если имеется желание изменить интерфейс списка, то можно создать свой layout-ресурс, что и будет рассмотрено в данной статье с использованием примера, описанного в предыдущей статье. Конечно же, изменения в примере будут существенными, и, в первую очередь, они будут касаться прокручиваемого списка. В статье будут рассмотрены :
Таким образом, в примере будет не только определен собсвенный интерфейс прокручиваемого списка ListView, но и представлена возможность динамически добавлять элементы в список. На следующем скриншоте изображен интерфейс запущенного примера, описание которого представлено ниже. В верхней части размещен компонент ввода текстового значения, которое используется для добавления нового элемента в список. Ниже размещен прокручиваемый список на фоне земли. В нижней части открыта виртуальная клавиатура.
Примечание : для подключения дополнительного/русского языка в виртуальной клавиатуре необходимо в виртуальном устройстве открыть настройки и добавить свой/русский язык. После этого в виртуальной клавиатуре можно будет выбирать язык. Пример настройки прокручиваемого спискаПри создании собственного интерфейса разметки прокручиваемого списка ListView необходимо определиться с функционалом компонента, чтобы правильно выбрать шаблон интерфейса. Допустим, что нам необходимо в прокручиваемом списке выделять несколько записей, подобно тому, как это происходит в настройках какой-либо игры. То есть, необходимо использовать список с checkbox'ами. Для этого в качестве основы нашей разметки используем android.R.layout.simple_list_item_checked и создадим собственный шаблон list_item.xml : Разметка списка list_item.xml<?xml version="1.0" encoding="utf-8"?> <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/list_item" android:layout_width="220dp" android:layout_height="40dp" android:textColor="#00cc22" android:textSize="20sp" android:textStyle="bold" android:checkMark="?android:attr/textCheckMark"> </CheckedTextView> В разметке компонента определяются параметры интерфейса отдельной записи списка ListView :
Описание интерфейсаВ примере используется разделитель элементов списка. Разделитель определяется в описании интерфейсной разметки (layout) компонента. В примере разделителем является обычная линия, цвет которой (name="color_yellow") необходимо определить в ресурсном файле res/color.xml. Ресурсный файл color.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="color_yellow">
#cccc00
</color>
</resources>
Если в качестве разделителя использовать ресурсное изображение, например res/drawable/divider.png, то необходимо учитывать наличие фонового изображения, т.е. "прозрачность" разделителя. Листинг разметкиВ описании разметки интерфейса присутствуют два компонента : EditText, ListView. В качестве фонового изображения используются описанные в первой части статьи изображения @drawable/earth_portrait и @drawable/earth_landscape. Интерес, с точки зрения темы статьи, представляет описание компонента ListView, включающее :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mainlayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/earth_portrait"
tools:context=".MainActivity">
<EditText
android:id="@+id/etItem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="" />
<ListView
android:id="@+id/list"
android:choiceMode="multipleChoice"
android:paddingTop="20dp"
android:paddingLeft="60dp"
android:divider="@color/color_yellow"
android:dividerHeight="3dp"
android:layout_width="300dp"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
Листинг активности приложенияВ коде активности изменился только метод onCreate. Методы onResume, onConfigurationChanged, setBackgroundImage описаны в предыдущей статье. На что следует обратить внимание в методе onCreate?
import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;
import android.os.Bundle;
import android.view.View;
import android.view.KeyEvent;
import android.app.Activity;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.content.res.Configuration;
import android.graphics.drawable.Drawable;
public class MainActivity extends Activity
{
private ArrayAdapter<String> adapter ;
private List<String> list ;
private LinearLayout linearLayout;
private int orientation ;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_custom);
linearLayout = findViewById(R.id.mainlayout);
orientation = Configuration.ORIENTATION_PORTRAIT;
String[] data;
data = getResources().getStringArray(R.array.names);
list = new ArrayList<>(Arrays.asList(data));
adapter = new ArrayAdapter<>(this,
R.layout.list_item, list);
ListView listView = findViewById(R.id.list);
listView.setAdapter(adapter);
final EditText editText = findViewById(R.id.etItem);
// Подключаем слушателя клавиш
editText.setOnKeyListener(new View.OnKeyListener() {
public boolean onKey(View v, int keyCode,
KeyEvent event) {
if (event.getAction()==KeyEvent.ACTION_DOWN)
if (keyCode == KeyEvent.KEYCODE_ENTER) {
String txt;
txt = editText.getText().toString();
list.add(txt);
adapter.notifyDataSetChanged();
editText.setText("");
return true;
}
return false;
}
});
}
@Override
public void onResume()
{
super.onResume();
setBackgroundImage(orientation);
}
@Override
public void onConfigurationChanged(Configuration config)
{
super.onConfigurationChanged(config);
setBackgroundImage(config.orientation);
orientation = config.orientation;
}
private void setBackgroundImage(final int orientation)
{
Drawable image;
image = this.getResources().getDrawable(
R.drawable.earth_landscape, null);
if (orientation==Configuration.ORIENTATION_PORTRAIT)
image = this.getResources().getDrawable(
R.drawable.earth_portrait, null);
image.setAlpha(32);
linearLayout.setBackground(image);
}
}
Связанные страницы
Модули Android приложения Скачать примерОписанный пример можно скачать здесь (824 Kб). |
