カスタム ArrayAdapter を使用して ListView を作成しようとしています。ここからの例に従ってください。以下のコードでは、ListActivity を作成しました。このリストは、カスタム ArrayAdapter - OrderAdapter から値を取得しています。OrderAdapter は ArrayAdapter から要素を取得しています
アダプターの要素を埋めるために runOnUiThread を使用しています。しかし、このスレッドの 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;
}
}
}
注文.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;
}
}