listview filled by response of a POST made to webservice - with custom adapter + viewholder

Costas

Administrator
Staff member
//reference - http://loopj.com/android-async-http/

JavaScript:
//fragment.java
private ListView lstv;
private Frag_Products_Adapter lstv_adapter;
private List<Frag_Product> Frag_Product_LIST = null;

@Override
public void onActivityCreated(Bundle savedInstanceState) {
	super.onActivityCreated(savedInstanceState);

	// init list
	Frag_Product_LIST = new ArrayList<Frag_Product>();

	lstv = (ListView) getView().findViewById(R.id.frag_lstv);
	lstv.setOnItemClickListener(this);
	lstv_adapter = new Frag_Products_Adapter(getActivity(), Frag_Product_LIST);
	lstv.setAdapter(lstv_adapter);

	// EndlessScrollListener
	lstv.setOnScrollListener(new EndlessScrollListener());

	get_products();
}

private void get_products() {
	AsyncHttpClient client = new AsyncHttpClient();
	RequestParams clparam = new RequestParams();

	clparam.add("x", Dynomite.aid);

	client.post(getActivity(), "http://www.x.com/mobile.ashx", clparam, new AsyncHttpResponseHandler() {

		@Override
		public void onFailure(Throwable t, String error){
			General.mes(getActivity(), "Error1 : " + error);				
		}
		
		@Override
		public void onSuccess(String response) {
			if (response == null || response.length() < 10)
				return;

			String resp = response;
			JSONArray products = null;
			Frag_Product item = null;

			try {
				products = new JSONArray(resp);

				if (products == null || resp.length() < 10)
					return;

				JSONObject product;

				for (int i = 0; i < products.length(); i++) {

					item = new Frag_Product();

					product = (JSONObject) products.get(i);

					item.setId(product.getInt("id"));
					item.setDescription(product.getString("description"));
					
					if (product.isNull("subcategory_id"))
						item.setSubcategory_id(0);
					else 
						item.setSubcategory_id(product.getInt("subcategory_id"));
					

					Frag_Product_LIST.add(item);
				}
			} catch (JSONException e) {
				General.mes(getActivity(), "Error2 : " + e.getMessage());
			} finally {
				lstv_adapter.notifyDataSetChanged();
				progress.dismiss();
			}
		}
	});
}


public class EndlessScrollListener implements OnScrollListener {

	private int visibleThreshold = 5;
	private int currentPage = 0;
	private int previousTotal = 0;
	private boolean loading = true;

	public EndlessScrollListener() {
	}

	public EndlessScrollListener(int visibleThreshold) {
		this.visibleThreshold = visibleThreshold;
	}

	@Override
	public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
		if (loading) {
			if (totalItemCount > previousTotal) {
				loading = false;
				previousTotal = totalItemCount;
				currentPage++;
			}
		}
		if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
			// I load the next page of gigs using a background task,
			// but you can call any function here.
			// new LoadGigsTask().execute(currentPage + 1);
			loading = true;
		}
	}

	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
	}
}

//Frag_Product.java
public class Frag_Product {
	private int id;
	private String description;
	private int subcategory_id;
	
	public String getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getSubcategory_id() {
		return subcategory_id;
	}
	public void setSubcategory_id(int subcategory_id) {
		this.subcategory_id = subcategory_id;
	}
}
 
 
JavaScript:
//Frag_Products_Adapter.java
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.graphics.Paint;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

public class Frag_Products_Adapter extends BaseAdapter {

	Context context;
	List<Frag_Product> rowItem;

	Frag_Products_Adapter(Context context, List<Frag_Product> rowItem) {
		this.context = context;
		this.rowItem = rowItem;

	}

	@Override
	public int getCount() {

		return rowItem.size();
	}

	@Override
	public Object getItem(int position) {

		return rowItem.get(position);
	}

	@Override
	public long getItemId(int position) {

		return rowItem.indexOf(getItem(position));
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {

		if (convertView == null) {
			LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
			convertView = mInflater.inflate(R.layout.frag_lstv_item, null);
		}

		ViewHolder holder;
		holder = new ViewHolder();

		holder.product_image = (ImageView) convertView.findViewById(R.id.frag__product_image);
		holder.product_description = (TextView) convertView.findViewById(R.id.frag__product_description);

		Frag_Product item = rowItem.get(position);

		Picasso.with(context).load("http://images.x.com/" + item.getImage_url()).into(holder.product_image);

		// sub-category - views are recycled - http://stackoverflow.com/a/6118581/1320686
		if (item.getSubcategory_id() > 0) {
			holder.product_sub_category.setText(item.getSubcategory_name());
			holder.product_sub_category.setVisibility(View.VISIBLE);
		} else {
			holder.product_sub_category.setVisibility(View.GONE);
		}


		return convertView;
	}

	class ViewHolder {
		// product
		ImageView product_image;
		TextView product_description;
		TextView product_sub_category;
	}
}

https://www.pipiscrew.com/2016/02/android-listview-w-checkboxes-filled-by-sqlite/
 
Top