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