2009-10-20 10 views
1

'작동하지 않습니다'대신 'I '과 같은 형식으로 작성해야하지만 첫 번째 버전은 더 좋아집니다. :) 내가 뭘하려고하면 다음과 같다 : 사용자 정의 어댑터를 사용하여 객체 ('아무튼 Android listview 항목이 표시되지 않습니다.

    1. 는 웹에서 XML을 다운로드를 분석하고 일부 객체의 ArrayList를 만들 (완료 및 작업) 표시 내가 ArrayList를에 항목을 추가하는 경우 t 작업)는

    두 번째는 내가 에

    m_orderAdapter = new OrderAdapter(this,m_orders); //code for orderadapter 
    below 
    setListAdapter(m_orderAdapter); 
    
    를 사용하여 뷰를 추가하기 전에 작동 주문 객체로

    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을 구문 분석 : (내에서 onCreate 방법)

    handler = new Handler(); 
         viewOrders = new Runnable(){ 
    
          @Override 
          public void run() { 
           getOrders(); 
    
          } 
    
         }; 
         new Thread(){ 
          @Override 
          public void run(){ 
           handler.post(viewOrders); 
          } 
         }.start(); 
    

    다음, 다음과 같은 방법에 대한 코드 :

    이 같은 웹 뭔가 발견 그 배열 목록을 으로 반환합니다. 그런 다음이 목록을 회원 배열 목록 m_orders에 설정합니다. 일단 다운로드 및 구문 분석 나는 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(); 
         } 
         }; 
    

    를 사용하여 UI 스레드 에 returnRes 방법을 실행하고 내 어댑터 notifyDataSetChanged()를 호출 이루어집니다. 나는 내 m_orders리스트 내부의 데이터를 디버깅 할 때

    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); 
        } 
    
    } 
    

    하지만 호출 할 때 아무것도 notifyDataSetChanged 없습니다 :

    나는이 모든 물건을 ListView에 어댑터 자체의 코드를 확장 할 뷰는 아래와 같습니다 그런데 내가 생각하기에 UI 스레드에서 을 실행해야한다고 읽었습니다. 그래서 문제가 뭐야? 어떤 도움을 주시면 감사하겠습니다. 또는 에있는 좋은 자습서로 연결되는 링크를 통해 웹에서 런타임시 목록보기를 업데이트하는 방법에 대해이 문제를 설명 할 수 있습니까?

  • 답변

    0

    안녕하세요. 내 모습을 보시지 않으시겠습니까? answer for this post - 내가 필요한 것 같아요.

    여기 다시 게시 해 드리겠습니다.

    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; 
    } 
    } 
    
    관련 문제