0

我正在尝试使用自定义 ArrayAdapter 创建一个 ListView。按照这里的例子。在下面的代码中,我创建了一个 ListActivity。此列表从自定义 ArrayAdapter - OrderAdapter 中获取其价值。OrderAdapter 正在从 ArrayAdapter 获取其元素

我正在使用 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;
        }
    }
}

订单.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;
    }
}
4

1 回答 1

1

试试这个...

做一个方法OrderAdapter

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

并在run()UI Thread 中执行

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

编辑对您的代码进行一些折射...像这样制作

  • 在 onCreat() 中新的 SampleTask().execute(); 和

    公共类 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)
    }
    
于 2012-07-06T12:57:44.600 回答