2010-07-22 2 views
8

Возможно ли обновить SimpleAdapter? У меня есть список данных и нижний колонтитул, в котором говорится «См. Следующие результаты». Когда этот элемент списка щелкнут, я фиксирую событие и получаю новые данные. Затем я хочу заменить данные в ListView на эти новые данные, но я не могу понять, как это сделать. Есть идеи? Я не хочу использовать ArrayAdapter, потому что, насколько я вижу, элементы могут содержать только одну строку, где мне нужно, чтобы она содержала несколько строк и ints.Как обновить SimpleAdapter в Android

ответ

10

Update: Согласно del116, вы действительно можете дать SimpleAdapter изменяемую карту, а затем вручную вызвать notifyDataSetChanged метод адаптера, когда требуется список, чтобы обновить. Тем не менее, моя нижняя точка ниже касается документации SimpleAdapter, указывающей, что она предназначена для статических данных; использование его для изменяемых данных идет вразрез с его дизайном, поэтому, если вы будете использовать этот метод, я обязательно буду проверять, продолжает ли он работать в новых выпусках Android, когда они появятся.

(Original комментарий следующим образом :)

Если вы посмотрите на SimpleAdapter description он говорит, что это «простой адаптер для отображения статические данные для представления, определенные в файле XML.» Я добавил акцент - просто: SimpleAdapater не создан для использования с данными, которые меняются; он обрабатывает только статические данные. Если вы не можете использовать ArrayAdapter, потому что у ваших данных больше одного бита текста, вам придется либо создать собственный пользовательский номер ListAdapter, либо поместить свои данные в БД и использовать один из CursorAdapter s.

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

+4

Ваш ответ здесь действительно вводит в заблуждение. После обновления данных массива и вызова notifyDataSetChanged() в моем SimpleAdapter я смог обновить simpleAdapter. Нет необходимости использовать ArrayAdapter для вызова notifyDataSetChanged(). – dell116

+1

@ dell116 Достаточно честно. Я упомянул об этой возможности в конце своего ответа, но я повысил ее до вершины, основываясь на ваших отзывах, что она действительно работает; Я не проверял его. Я все же утверждаю, что выполнение такой вещи заслуживает некоторой осторожности, поскольку в документации SimpleAdapter указано, что она предназначена для статических данных. –

+0

Оглядываясь назад на это сейчас ... ничего себе. Я ничего не знал о программировании или предполагаемой цели SimpleAdapter. Если вы используете ListView (или любой AdaptViewView), поддерживаемый структурой данных, которые будут меняться, не используйте SimpleAdapter. Foot.inMouth (истина); – dell116

2

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

3
ListView lv= (ListView) findViewById(R.id.loglist); 
ArrayList<Map<String, String>> list = buildData(); 
String[] from = { "time", "message" }; 
int[] to = { R.id.logtime, R.id.logmessage }; 

adapter = new SimpleAdapter(getApplicationContext(), list,R.layout.log_list_row, from,to); 
lv.setAdapter(adapter); 

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

Надеется, что это помогает .. :)

0

я не смог notifyDataSetChanged() для работы по обновлению моего SimpleAdapter, так вместо этого я пытался первым удаляя все виды, которые были прикреплены к родительскому макету с помощью removeAllViews(), а затем добавить в ListView, и работал, что позволила мне обновить пользовательский интерфейс:

LinearLayout results = (LinearLayout)findViewById(R.id.results); 
ListView lv = new ListView(this); 
ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>(); 
SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.directory_row, 
        new String[] { "name", "dept" }, new int[] { R.id.name, R.id.dept }); 

for (...) { 
    HashMap<String, String> map = new HashMap<String, String>(); 
    map.put("name", name); 
    map.put("dept", dept); 
    list.add(map); 
} 

lv.setAdapter(adapter); 
results.removeAllViews();  
results.addView(lv); 
-2
mySimpleAdapter.notifyDataSetChanged(); 

Используйте эту линию после обновления данные в данных Список HashMap

+0

, пожалуйста, ознакомьтесь с документацией, недоступной для SimpleAdapter, как указано выше. SimpleAdapter не предназначен для таких действий. – Manny265