ListView未显示 - 从服务器获取数据

时间:2013-05-22 10:25:59

标签: android android-listview

尝试从服务器检索数据,并希望在ListView中显示该数据。

问题:ListView未显示

OrdersActivity.java:

   public class OrdersActivity extends Activity 
    { 
    public static final String LOG_TAG = "OrdersActivity";
    ArrayList<HashMap<String, String>> d = new ArrayList<HashMap<String, String>>();;
    ListView list;
    OrdersAdapter adapter;
    @Override

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_orders);


        final ArrayList<HashMap<String, String>> itemsList = new ArrayList<HashMap<String, String>>();
        list = (ListView) findViewById(R.id.listView1);
        adapter = new OrdersAdapter(this, itemsList);
        list.setAdapter(adapter);


        // Permission StrictMode
        if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }
    }
}

activity_orders.java:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffff" >

    <include
        android:id="@+id/header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        layout="@layout/header_orders" />

<ListView 
    android:layout_width="match_parent" 
    android:id="@+id/listView1" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_below="@+id/header" 
    android:cacheColorHint="#00000000" 
    android:divider="#b5b5b5" 
    android:dividerHeight="1dp" 
    android:layout_alignParentBottom="true" />

</RelativeLayout>

OrdersActivity.java:

public class OrdersAdapter extends BaseAdapter {
    TextView tName,tId,tOid ;
    private Activity activity;
    private ArrayList<HashMap<String, String>> data;
    private static LayoutInflater inflater=null;
    String strName,strMemberID ;

    public OrdersAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
        activity = a;
        data=d;
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public int getCount() {
        return data.size();
        // return (data == null) ? 0 : data.size();
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        View vi=convertView;
        if(convertView==null)
            vi = inflater.inflate(R.layout.listrow_orders, null);

        tId = (TextView)vi.findViewById(R.id.txtTotalAmount);
        tName = (TextView)vi.findViewById(R.id.txtItemDetails);

        HashMap<String, String> item = new HashMap<String, String>();
        item = data.get(position);

        tId.setText(item.get(strName));
        tName.setText(item.get(strMemberID));


            String url = "http://172.16.0.4/res/order_fetch.php";
            Intent intent= activity.getIntent();
            String MemberID = intent.getStringExtra("MemberID");
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("sMemberID", MemberID));
            String resultServer  = getHttpPost(url,params);

            strMemberID = "";
            strName = "";


            JSONObject c;
            try {
            c = new JSONObject(resultServer);
            strMemberID = c.getString("TotalAmount");               
            strName = c.getString("ItemDetails");

            if(!strMemberID.equals(""))
            {                   
                tName.setText(strName);
                tId.setText(strMemberID);               
            }
            else
            {               
                tName.setText("-");
                tId.setText("-");
            }
            } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            }
            return vi;

}       

        public String getHttpPost(String url,List<NameValuePair> params) {
            StringBuilder str = new StringBuilder();
            HttpClient client = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);

        try {
            httpPost.setEntity(new UrlEncodedFormEntity(params));
            HttpResponse response = client.execute(httpPost);
            StatusLine statusLine = response.getStatusLine();
            int statusCode = statusLine.getStatusCode();
            if (statusCode == 200) { // Status OK
                HttpEntity entity = response.getEntity();
                InputStream content = entity.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(content));
                String line;
                while ((line = reader.readLine()) != null) {
                    str.append(line);
                }
            } else {
                Log.e("Log", "Failed to download result..");
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str.toString();
    }
}

listrow_orders.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="5dp"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp"
    android:layout_marginTop="5dp"
    android:background="@drawable/btn_background"
    android:orientation="horizontal"
    android:padding="5dip" >

<TextView
    android:id="@+id/txtTotalAmount"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/textView1"
    android:layout_below="@+id/textView1"
    android:textColor="#a60704"
    android:text="TextView" />

<TextView
    android:id="@+id/txtItemDetails"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/textView3"
    android:layout_below="@+id/textView3"
    android:textColor="#a60704"
    android:text="Item Details Here" />

<TextView
    android:id="@+id/textView3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/txtTotalAmount"
    android:layout_below="@+id/txtTotalAmount"
    android:layout_marginTop="17dp"
    android:text="Ordered Items:"
    android:textColor="#a60704"
    android:textAppearance="?android:attr/textAppearanceMedium" />

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:text="Total Amount"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:textColor="#a60704" />

</RelativeLayout>

2 个答案:

答案 0 :(得分:0)

在自定义ListView时,您需要将数据存储在视图中。试着实现这个:

public class PlacesListAdapter extends BaseAdapter
{
    // private Context mContext;
    private LayoutInflater mInflater;
    private ArrayList<String> AL_id_text = new ArrayList<String>();
    private ArrayList<String> AL_text = new ArrayList<String>();

    public PlacesListAdapter(Context c, ArrayList<String> AL_name_time, ArrayList<String> AL_name_time1)
    {
        mInflater = LayoutInflater.from(c);
        // mContext = c;
        this.AL_id_text = AL_name_time;
        this.AL_text = AL_name_time1;
    }

    public int getCount()
    {
        return AL_id_text.size();
    }

    public Object getItem(int position)
    {
        return AL_id_text.get(position);
    }

    public long getItemId(int position)
    {
        return position;
    }

    static class ViewHolder
    {
        TextView txt_maintext;
        TextView txt_mtext;
    }

    public View getView(final int position, View convertView, ViewGroup parent)
    {
        // TODO Auto-generated method stub
        final ViewHolder holder;
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.place_row, null);
            holder = new ViewHolder();

            holder.txt_maintext = (TextView) convertView.findViewById(R.id.txt_maintext);
            holder.txt_mtext = (TextView) convertView.findViewById(R.id.txt_mtext);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.txt_maintext.setText(AL_id_text.get(position));
        holder.txt_mtext.setText(AL_text.get(position));

        return convertView;
    }
}

答案 1 :(得分:0)

当它在屏幕上逐个呈现视图元素时,android的ListView会调用getView()方法。您不应该在getView()方法中获取数据,这通常会阻止您的UI线程。

执行此操作的最佳方法是先获取数据,将其存储在您喜欢的对象中,然后使用它们创建ListAdapter实例。这样,当Android为您绘制ListView时,您无需等待图像提取完成。

所以尝试使用

获取数据
 getHttpPost()
在getView方法之外的

,最好是异步。

使用此方法获取数据后适当填充itemsList。使用此itemList数据创建ListAdapter实例。将此适配器设置为列表视图。