Элемент списка Android не отображается

1

Я должен написать в названии вместо "не работает" что-то вроде "я не знаю, как это сделать ", но первая версия выглядит лучше:). Я пытаюсь сделать следующее:

  • Загрузите xml из Интернета, проанализируйте его и создайте ArrayList. объекты (сделанные и работающие)
  • Отображение объектов с помощью пользовательского адаптера (не работает)

Второй работает, если я добавляю элементы в свой массив 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 ничего не происходит, я прочитал, что я должен выполнить это на пользовательский интерфейс, который, как мне кажется, я делаю. Так в чем проблема? любая помощь высоко ценится, или, может быть, просто ссылка на хороший учебник по в Интернете объясняя эту проблему, как обновить представление списка во время выполнения?

Теги:
listview

1 ответ

0

Эй, Арута, почему ты не видишь мой ответ для этого сообщения - Я думаю, что это то, что вам нужно.

Или просто позвольте мне перепечатать его здесь

Вы можете расширить 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;
}
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню