Статьи

Пример Android ListView с адаптером

Как работает Android ListView с адаптером, мне не очень понятно, пока я не прочитаю замечательные примеры и статью Lucas Rocha: Советы по повышению производительности для Android ListView .

Сегодня я собираюсь показать вам код, который я использую всякий раз, когда я хочу, чтобы пользователь выбрал «элемент» в AlertDialog с ListView. Если вы ищете пример AlertDialog с простым ListView (без адаптера), вот мое пост в блоге: Android AlertDialog с ListView .

Здесь элемент ListView содержит текст (имя элемента) и идентификатор (идентификатор элемента), поэтому всякий раз, когда пользователь выбирает элемент во всплывающем окне, вы сможете получить текст и идентификатор этого выбранного элемента. Это очень полезно, если элементы из базы данных — записи с идентификаторами и именами. Теги (идентификаторы элементов) были установлены с помощью метода setTag () TextView.

Видео демо

Вот окончательный вывод нашего кода на сегодня. Имя и ID были получены и показаны через тост.

Скачать код

Вы можете скачать код, который мы использовали здесь: ListViewPopUpWithAdapter.zip

Давайте код!

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

1. activity_main.xml — наш основной макет. Наш триггер для отображения ListView — кнопка.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
 
    <Button
        android:id="@+id/buttonShowPopUp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Show AlertDialog with ListView" />
 
</RelativeLayout>

2. MainActivity.java — покажет основной макет, кнопку в центре экрана. Нажатие на эту кнопку покажет наш удивительный ListView.

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package com.example.listviewpopupwithadapter;
 
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.app.Activity;
import android.app.AlertDialog;
 
public class MainActivity extends Activity {
 
    AlertDialog alertDialogStores;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        // a button to show the pop up with a list view
        View.OnClickListener handler = new View.OnClickListener(){
            public void onClick(View v) {
                switch (v.getId()) {
 
                    case R.id.buttonShowPopUp:
                        showPopUp();
                        break;
                }
            }
        };
 
        findViewById(R.id.buttonShowPopUp).setOnClickListener(handler);
 
    }
 
    public void showPopUp(){
 
        // add your items, this can be done programatically
        // your items can be from a database
        ObjectItem[] ObjectItemData = new ObjectItem[20];
 
        ObjectItemData[0] = new ObjectItem(91, "Mercury");
        ObjectItemData[1] = new ObjectItem(92, "Watson");
        ObjectItemData[2] = new ObjectItem(93, "Nissan");
        ObjectItemData[3] = new ObjectItem(94, "Puregold");
        ObjectItemData[4] = new ObjectItem(95, "SM");
        ObjectItemData[5] = new ObjectItem(96, "7 Eleven");
        ObjectItemData[6] = new ObjectItem(97, "Ministop");
        ObjectItemData[7] = new ObjectItem(98, "Fat Chicken");
        ObjectItemData[8] = new ObjectItem(99, "Master Siomai");
        ObjectItemData[9] = new ObjectItem(100, "Mang Inasal");
        ObjectItemData[10] = new ObjectItem(101, "Mercury 2");
        ObjectItemData[11] = new ObjectItem(102, "Watson 2");
        ObjectItemData[12] = new ObjectItem(103, "Nissan 2");
        ObjectItemData[13] = new ObjectItem(104, "Puregold 2");
        ObjectItemData[14] = new ObjectItem(105, "SM 2");
        ObjectItemData[15] = new ObjectItem(106, "7 Eleven 2");
        ObjectItemData[16] = new ObjectItem(107, "Ministop 2");
        ObjectItemData[17] = new ObjectItem(108, "Fat Chicken 2");
        ObjectItemData[18] = new ObjectItem(109, "Master Siomai 2");
        ObjectItemData[19] = new ObjectItem(110, "Mang Inasal 2");
 
        // our adapter instance
        ArrayAdapterItem adapter = new ArrayAdapterItem(this, R.layout.list_view_row_item, ObjectItemData);
 
        // create a new ListView, set the adapter and item click listener
        ListView listViewItems = new ListView(this);
        listViewItems.setAdapter(adapter);
        listViewItems.setOnItemClickListener(new OnItemClickListenerListViewItem());
 
        // put the ListView in the pop up
        alertDialogStores = new AlertDialog.Builder(MainActivity.this)
            .setView(listViewItems)
            .setTitle("Stores")
            .show();
 
    }
 
}

3. ObjectItem.java — каждый элемент в списке рассматривается как объект с именем и идентификатором.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
package com.example.listviewpopupwithadapter;
 
//another class to handle item's id and name
public class ObjectItem {
 
    public int itemId;
    public String itemName;
 
    // constructor
    public ObjectItem(int itemId, String itemName) {
        this.itemId = itemId;
        this.itemName = itemName;
    }
 
}

4. ArrayAdapterItem.java — от которого зависит производительность нашего ListView.

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package com.example.listviewpopupwithadapter;
 
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
 
// here's our beautiful adapter
public class ArrayAdapterItem extends ArrayAdapter<ObjectItem> {
 
    Context mContext;
    int layoutResourceId;
    ObjectItem data[] = null;
 
    public ArrayAdapterItem(Context mContext, int layoutResourceId, ObjectItem[] data) {
 
        super(mContext, layoutResourceId, data);
 
        this.layoutResourceId = layoutResourceId;
        this.mContext = mContext;
        this.data = data;
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
 
        /*
         * The convertView argument is essentially a "ScrapView" as described is Lucas post
         * It will have a non-null value when ListView is asking you recycle the row layout.
         * So, when convertView is not null, you should simply update its contents instead of inflating a new row layout.
         */
        if(convertView==null){
            // inflate the layout
            LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
            convertView = inflater.inflate(layoutResourceId, parent, false);
        }
 
        // object item based on the position
        ObjectItem objectItem = data[position];
 
        // get the TextView and then set the text (item name) and tag (item ID) values
        TextView textViewItem = (TextView) convertView.findViewById(R.id.textViewItem);
        textViewItem.setText(objectItem.itemName);
        textViewItem.setTag(objectItem.itemId);
 
        return convertView;
 
    }
 
}

5. OnItemClickListenerListViewItem.java — отвечает, что произойдет, если пользователь щелкнет элемент в списке?

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
34
35
package com.example.listviewpopupwithadapter;
 
import android.content.Context;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.TextView;
import android.widget.Toast;
 
/*
 * Here you can control what to do next when the user selects an item
 */
public class OnItemClickListenerListViewItem implements OnItemClickListener {
 
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
 
        Context context = view.getContext();
 
        TextView textViewItem = ((TextView) view.findViewById(R.id.textViewItem));
 
        // get the clicked item name
        String listItemText = textViewItem.getText().toString();
 
        // get the clicked item ID
        String listItemId = textViewItem.getTag().toString();
 
        // just toast it
        Toast.makeText(context, "Item: " + listItemText + ", Item ID: " + listItemId, Toast.LENGTH_SHORT).show();
 
        ((MainActivity) context).alertDialogStores.cancel();
 
    }
 
}

6. list_view_row_item.xml — макет каждого элемента в списке. Вы можете изменить это, если хотите иметь изображение или субтитры для каждого элемента вашего ListView.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp" >
 
    <TextView
        android:id="@+id/textViewItem"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:text="Item name here..."
        android:textSize="15dp" />
 
</RelativeLayout>

Ссылка: Android ListView с примером адаптера от нашего партнера по JCG Майка Далисая в блоге «Код ниндзя» .