Как работает 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" 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 namepublic 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 adapterpublic 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> |