Reputation: 506
I am making an app in which i want to show all previous Order Details to user in a ListView using Server from PHPMYADMIN.
Problem: Not getting ListView in Activity, getting blank activity instead of ListView
OrdersAdapter.java:
public class OrdersAdapter extends BaseAdapter {
TextView tName,tId,tOid ;
String MemberID,resultServer,strMemberID,strName,strOrderID;
Activity activity;
LayoutInflater inflater;
ListView listView;
public OrdersAdapter(Activity a) {
// TODO Auto-generated constructor stub
activity = a;
inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getCount() {
return 0;
// TODO Auto-generated method stub
}
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View vi = convertView;
if (convertView == null)
vi = inflater.inflate(R.layout.listrow_orders, null); // listrow_cart
// Permission StrictMode
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
tId = (TextView)activity.findViewById(R.id.txtTotalAmount);
tName = (TextView)activity.findViewById(R.id.txtItemDetails);
String url = "http://172.16.0.4/res/order_fetch.php";
Intent intent= activity.getIntent();
MemberID = intent.getStringExtra("MemberID");
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("sMemberID", MemberID));
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;
}
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();
}
}
OrdersActivity.java:
public class OrdersActivity extends Activity
{
ListView mLstView1;
OrdersAdapter mViewOrdersAdpt;
@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_orders);
mLstView1 = (ListView) findViewById(R.id.listView1);
mViewOrdersAdpt = new OrdersAdapter(OrdersActivity.this);
mLstView1.setAdapter(mViewOrdersAdpt);
mLstView1.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v,
final int position, long id)
{
}
});
}
}
activity_orders.xml:
<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>
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>
Upvotes: 0
Views: 105
Reputation: 5979
It is good if you parse json
inside Activity
instead of BaseAdapter
, getView()
will be called multiple times so json will be parsed multiple times too
Inside Activity
write json fetching code inside AsyncTask
store data in ArrayList
, if you have single ArrayList than use like follow else you need to pass multiple ArrayList
to BaseAdapter constructor
onPostExecute use setAdapter();
Here,
mArrayList
is a ArrayList<String>
OrdersAdapter ordersAdapter = new OrdersAdapter(MyAct.this,mArrayList);
Inside BaseAdapter
ArrayList<String> mMyList;
public OrdersAdapter(Activity a, ArrayList<String> mList)
{
activity = a;
mMyList = mList;
inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
getCount
method
public int getCount() {
return mMyList.size();
}
Upvotes: 1
Reputation: 21937
Don't try to load data in getView() method because it is called by systems many times. You can check this two link to know better Yet another getView called multiple times and the second link custom listview adapter getView method being called multiple times, and in no coherent order So now what you have to do to overcome this problem. You load data from web so you can use asynctask that will be used to load the data and pass it in a class. Check this to know about asynctask http://developer.android.com/reference/android/os/AsyncTask.html From asynctask class you can pass this data in a class. This class holds the data and then you can use this data in main activity. It is best to parse json data in asynctask class. Actually you did not pass any data in your adapter class. That's why your listview did not show any data. Hope this will work.
Upvotes: 0
Reputation: 849
Pass a Collection, lets say strings in constructor
public OrdersAdapter(Activity a, List stringsToShow) {
// TODO Auto-generated constructor stub
activity = a;
inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.stringsToShow = stringsToShow;
}
and then
public int getCount() {
return stringsToShow.size();
}
And avoid doing so many things in getView().. Kamal karte ho Pande ji..
Upvotes: 0
Reputation: 2158
Problem in your OrdersAdapter.java class you must need to override adapter getCount() method in proper way like
public int getCount() {
return SIZE_OF_ARRAYLIST;
}
if you write return 0 then list will not display. So you need to return size of arrayList
Upvotes: 0