Я должен написать в названии вместо "не работает" что-то вроде "я не знаю, как это сделать ", но первая версия выглядит лучше:). Я пытаюсь сделать следующее:
Второй работает, если я добавляю элементы в свой массив ArrayList, прежде чем добавить его в представление с использованием
m_orderAdapter = new OrderAdapter(this,m_orders); //code for orderadapter
below
setListAdapter(m_orderAdapter);
Я нашел в Интернете что-то вроде этого: (в моем методе onCreate)
handler = new Handler();
viewOrders = new Runnable(){
@Override
public void run() {
getOrders();
}
};
new Thread(){
@Override
public void run(){
handler.post(viewOrders);
}
}.start();
то следующий код для методов:
private void getOrders(){
try{
OrderManager om = new OrderManager();
m_orders = om.getOrdersFromWeb();
Log.i("ARRAY", ""+ m_orders.size());
} catch (Exception e) {
Log.e("BACKGROUND_PROC", e.getMessage());
}
runOnUiThread(returnRes);
}
OrderManager загружает и анализирует xml в объекты Order и возвращает
список массивов. Затем я устанавливаю этот список в список имен m_orders.
После завершения загрузки и разбора я запускаю метод returnRes в потоке ui
используя метод runOnUiThread
private Runnable returnRes = new Runnable() {
@Override
public void run() {
if(m_orders != null && m_orders.size() > 0){
Log.i("ORDER",m_orders.get(0).getOrder_id());
setListAdapter(m_orderAdapter);
m_orderAdapter.notifyDataSetChanged();
}
m_orderAdapter.notifyDataSetChanged();
}
};
и я вызываю notifyDataSetChanged() на моем адаптере.
В представлении я делаю все это, расширяя ListView и код адаптера он указан ниже:
public class OrderAdapter extends BaseAdapter{
private Context ctx;
private List<Order> orders;
public OrderAdapter(Context ctx, List<Order> orderLst){
this.ctx = ctx;
this.orders = orderLst;
}
@Override
public int getCount() {
return orders.size();
}
@Override
public Object getItem(int pos) {
return orders.get(pos);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Order o = orders.get(position);
return new OrderListAdapterView(this.ctx,o);
}
}
Когда я отлаживаю, у меня есть данные внутри моего списка m_orders, но когда я звоню notifyDataSetChanged ничего не происходит, я прочитал, что я должен выполнить это на пользовательский интерфейс, который, как мне кажется, я делаю. Так в чем проблема? любая помощь высоко ценится, или, может быть, просто ссылка на хороший учебник по в Интернете объясняя эту проблему, как обновить представление списка во время выполнения?
Эй, Арута, почему ты не видишь мой ответ для этого сообщения - Я думаю, что это то, что вам нужно.
Или просто позвольте мне перепечатать его здесь
Вы можете расширить ArrayAdapter. Вот пример кода для вас. В этом примере - SearchItem - это пользовательский POJO. В основном вам необходимо переопределить метод getView() для построения вашей строки путем раздувания макета строки, а затем заполнения значений на основе списка элементов и текущей позиции
class SearchItemsAdapter extends ArrayAdapter<SearchItem> {
Activity context;
List<SearchItem> items;
SearchHeader header;
@SuppressWarnings("unchecked")
public SearchItemsAdapter(final Activity context,
final Map<SearchHeader, List<SearchItem>> result) {
super(context, R.layout.item, (List) ((Object[]) result.values()
.toArray())[0]);
this.context = context;
this.header = result.keySet().iterator().next();
this.items = result.get(this.header);
}
@Override
public View getView(final int position, final View convertView,
final ViewGroup parent) {
final View view = this.context.getLayoutInflater().inflate(
R.layout.item, null);
final SearchItem item = this.items.get(position);
((TextView) view.findViewById(R.id.jt)).setText(item.jt);
((TextView) view.findViewById(R.id.dp)).setText(item.dp);
((TextView) view.findViewById(R.id.cn)).setText(item.cn);
((TextView) view.findViewById(R.id.loc)).setText(item.loc.name);
final TextView body = ((TextView) view.findViewById(R.id.e));
body.setText(item.e);
body.setTag(item.src[0]);
((TextView) view.findViewById(R.id.src)).setText(item.src[1]);
return view;
}
}