Возможно ли обновить SimpleAdapter? У меня есть список данных и нижний колонтитул, в котором говорится «См. Следующие результаты». Когда этот элемент списка щелкнут, я фиксирую событие и получаю новые данные. Затем я хочу заменить данные в ListView на эти новые данные, но я не могу понять, как это сделать. Есть идеи? Я не хочу использовать ArrayAdapter, потому что, насколько я вижу, элементы могут содержать только одну строку, где мне нужно, чтобы она содержала несколько строк и ints.Как обновить SimpleAdapter в Android
ответ
Update: Согласно del116, вы действительно можете дать SimpleAdapter
изменяемую карту, а затем вручную вызвать notifyDataSetChanged
метод адаптера, когда требуется список, чтобы обновить. Тем не менее, моя нижняя точка ниже касается документации SimpleAdapter, указывающей, что она предназначена для статических данных; использование его для изменяемых данных идет вразрез с его дизайном, поэтому, если вы будете использовать этот метод, я обязательно буду проверять, продолжает ли он работать в новых выпусках Android, когда они появятся.
(Original комментарий следующим образом :)
Если вы посмотрите на SimpleAdapter description он говорит, что это «простой адаптер для отображения статические данные для представления, определенные в файле XML.» Я добавил акцент - просто: SimpleAdapater
не создан для использования с данными, которые меняются; он обрабатывает только статические данные. Если вы не можете использовать ArrayAdapter, потому что у ваших данных больше одного бита текста, вам придется либо создать собственный пользовательский номер ListAdapter, либо поместить свои данные в БД и использовать один из CursorAdapter s.
В крайнем случае, если вам не нужно много производительность, может обновить ListView
подкрепленная SimpleAdapter
путем создания целого нового SimpleAdapter
экземпляра в любое время изменения ваших данных и говорить в виде списка, чтобы использовать его с помощью setListAdapter
.
SimpleAdapter
предназначен для статических данных, поэтому ваша производительность может отличаться. Лучшим решением, вероятно, является переход на другой тип адаптера, например ArrayAdapter
, или создание нового SimpleAdapter
каждый раз, когда вы меняете набор данных.
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. Имейте в виде, что вы должны обновить список переменный с новыми данными ..
Надеется, что это помогает .. :)
я не смог 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);
mySimpleAdapter.notifyDataSetChanged();
Используйте эту линию после обновления данные в данных Список HashMap
, пожалуйста, ознакомьтесь с документацией, недоступной для SimpleAdapter, как указано выше. SimpleAdapter не предназначен для таких действий. – Manny265
Ваш ответ здесь действительно вводит в заблуждение. После обновления данных массива и вызова notifyDataSetChanged() в моем SimpleAdapter я смог обновить simpleAdapter. Нет необходимости использовать ArrayAdapter для вызова notifyDataSetChanged(). – dell116
@ dell116 Достаточно честно. Я упомянул об этой возможности в конце своего ответа, но я повысил ее до вершины, основываясь на ваших отзывах, что она действительно работает; Я не проверял его. Я все же утверждаю, что выполнение такой вещи заслуживает некоторой осторожности, поскольку в документации SimpleAdapter указано, что она предназначена для статических данных. –
Оглядываясь назад на это сейчас ... ничего себе. Я ничего не знал о программировании или предполагаемой цели SimpleAdapter. Если вы используете ListView (или любой AdaptViewView), поддерживаемый структурой данных, которые будут меняться, не используйте SimpleAdapter. Foot.inMouth (истина); – dell116