2012-07-06 63 views
0

我想用自定義ArrayAdapter創建一個ListView。 繼續從這裏的例子。 在下面的代碼中,我創建了一個ListActivity。 此列表正在從自定義ArrayAdapter - OrderAdapter中獲取其值。 OrderAdapter正在從ArrayAdapter獲取其元素帶有自定義ArrayAdapter的ListView - 線程問題

我正在使用runOnUiThread來填充adpater中的元素。 但是在這個線程的run()方法中,代碼進入了無限循環。 (見下面的評論)。 請檢查它爲什麼沒有離開for循環。

代碼:

public class SoftwarePassionView extends ListActivity { 

    private ProgressDialog m_progressDialog = null; 
    private ArrayList<Order> m_orders = null; 
    private OrderAdapter m_adapter; // Defined Below 
    private Runnable viewOrders; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.softwarepassionview); 
     m_orders = new ArrayList<Order>(); 


     viewOrders = new Runnable() { 
      @Override 
      public void run() { 
       getOrders(); 
      } 
     }; 

     Thread thread = new Thread(null, viewOrders, "MagnatoBackground"); 
     thread.start(); 
     m_progressDialog = ProgressDialog.show(SoftwarePassionView.this, "Please Wait", 
       "Retriving data", true); 

     this.m_adapter = new OrderAdapter(this, R.layout.row, m_orders); 
     setListAdapter(this.m_adapter); 
    } 

    private void getOrders() { 
     try { 
      m_orders = new ArrayList<Order>(); 
      Order o1 = new Order(); 
      o1.setOrderName("T-Shirt Purchase"); 
      o1.setOrderStatus("Dispatched"); 
      Order o2 = new Order(); 
      o2.setOrderName("Deo Purchase"); 
      o2.setOrderStatus("Pending"); 
      m_orders.add(o1); 
      m_orders.add(o2); 

      Thread.sleep(2000); 
     } catch (Exception e) { 
      Toast.makeText(this, e.toString(), Toast.LENGTH_SHORT).show(); 
     } 
     runOnUiThread(returnRes); 
    } 

    private Runnable returnRes = new Runnable() { 

     @Override 
     public void run() { 
      if (m_orders != null && m_orders.size() > 0) { 
       m_adapter.notifyDataSetChanged(); 
       /* 
       * Going in an infinite loop below 
       */ 
       for (int i = 0; i < m_orders.size(); i++) 
        m_adapter.add(m_orders.get(i)); 
      } 
      m_progressDialog.dismiss(); 
      m_adapter.notifyDataSetChanged(); 
     } 
    }; 

    private class OrderAdapter extends ArrayAdapter<Order> { 

     private ArrayList<Order> items; 

     public OrderAdapter(Context context, int textViewResourceId, 
       ArrayList<Order> items) { 
      super(context, textViewResourceId, items); 
      this.items = items; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      super.getView(position, convertView, parent); 
      View v = convertView; 
      try { 
       if (v == null) { 
        LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        v = vi.inflate(R.layout.row, null); 
       } 

       Order o = items.get(position); 
       if (o != null) { 
        TextView orderName = (TextView) v 
          .findViewById(R.id.topText); 
        TextView orderStatus = (TextView) v 
          .findViewById(R.id.bottomText); 
        orderName.setText(o.getOrderName()); 
        orderStatus.setText(o.getOrderStatus()); 
       } 
      } catch (Exception e) { 
       Toast.makeText(SoftwarePassionView.this, e.toString(), 
         Toast.LENGTH_SHORT).show(); 
      } 
      return v; 
     } 
    } 
} 

Order.java

public class Order { 
    private String orderName; 
    private String orderStatus; 

    public String getOrderName() { 
     return orderName; 
    } 

    public void setOrderName(String orderName) { 
     this.orderName = orderName; 
    } 

    public String getOrderStatus() { 
     return orderStatus; 
    } 

    public void setOrderStatus(String orderStatus) { 
     this.orderStatus = orderStatus; 
    } 
} 
+0

你應該使用[的AsyncTask(http://developer.android.com/reference/android/os/AsyncTask.html)。 – 2012-07-06 11:22:33

回答

1

試試這個...

做出了Methode在OrderAdapter

setList(ArrayList<Order> items); 
    { 
     this.items.clear(); 
     this.items.addAll(items); 
     notifyDataSetChanged(); 
    } 

和UI線程的做

if (m_orders != null && m_orders.size() > 0) { 
      m_adapter.setList(m_orders) 
      } 
      m_progressDialog.dismiss(); 

編輯做你的代碼的一些折射......作出這樣

  • 在onCreat

    ()新SampleTask()執行()。 和

    公共類SampleTask擴展的AsyncTask {

    @Override 
    protected void onPreExecute() { 
        super.onPreExecute(); 
        //show progress bar here 
    
    } 
    
    @Override 
    protected Void doInBackground(Void... params) { 
        //Do heavy work here 
        return null; 
    } 
    @Override 
    protected void onPostExecute(Void result) { 
    
        super.onPostExecute(result); 
    
        //Dissmiss the dialgo 
        //call m_adapter.setList(m_orders) 
    } 
    
+0

非常感謝你..它現在正在退出循環和m_adapters正在填充。但現在它不是屏幕@ setListAdapter(this.m_adapter)上的填充列表; – reiley 2012-07-06 13:54:58

+0

'items'不爲null並且有值?和你在哪裏調用'setListAdapter(this.m_adapter);' – 2012-07-06 13:59:27

+0

對不起,'this.items.addAll(items);'沒有添加值。但即使我使用for循環,並填充它,仍然不顯示任何東西在'setListAdapter(this.m_adapter);'[最後一行onCreate方法] – reiley 2012-07-06 14:27:25

相關問題