I am learning android and my code is working fine. It fetches data from website and displays it in list. but when subcat==1
it has 9 items to fetch. It displays 7 distinct item and repeats two items. first it was showing only four that was NullPointerException 5th image didn't had name so it repeated 4 image till 9 times, but now everything is fine still it shows only 7 and repeates 2 after that. Here is my code:
public class JSONAsyncTask extends AsyncTask<String, Void, Void> {
ProgressDialog pd;
Context context;
JSONAsyncTask(Context context) {
this.context = context;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
pd = new ProgressDialog(context);
pd.setIndeterminate(true);
pd.setCancelable(false);
pd.setCanceledOnTouchOutside(false);
pd.setMessage("Please wait..\nLoading data");
pd.show();
}
@Override
protected Void doInBackground(String... strings) {
ArrayList<item> jsonArrayList = new ArrayList<item>();
try {
HttpClient client = new DefaultHttpClient();
HttpGet httpget = new HttpGet("http://avdeal.in/get_all_products.php");
HttpResponse response = client.execute(httpget);
HttpEntity entity = response.getEntity();
String data = EntityUtils.toString(entity);
JSONObject jsonObject = new JSONObject(data);
if (jsonObject != null) {
String posts = jsonObject.getString("products");
JSONArray postsArray = new JSONArray(posts);
if (postsArray != null) {
if (postsArray.length() > 0) {
for (int i = 0; i < postsArray.length(); i++) {
JSONObject postsObject = postsArray
.getJSONObject(i);
int subcat = postsObject.getInt("subcat_id");
if (subcats == subcat) {
int id=postsObject.getInt("id");
String title = postsObject.getString("product_title");
String price = postsObject.getString("product_price");
String url = "http://avdeal.in/seller/upload_images/" + postsObject.getString("product_url");
list1.add(new item(id, title, price, url));
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
if (list1 != null) {
pd.dismiss();
adp = new actorAdapter(context, R.layout.listview, list1);
lv.setAdapter(adp);
adp.notifyDataSetChanged();
}
else {
pd.setMessage("No internet access");
}
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(itemView.this, "Please Wait " + i + 1, Toast.LENGTH_SHORT).show();
int id1 = list1.get(i).getId();
String name = list1.get(i).getName();
String price = list1.get(i).getPrice();
Bitmap bitmap = list1.get(i).getImage();
if (bitmap == null) {
Intent intent = new Intent(context, productDetail.class);
intent.putExtra("name", name);
intent.putExtra("price", price);
intent.putExtra("id", id1);
intent.putExtra("imagena", 1);
startActivity(intent);
} else {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
Intent intent = new Intent(context, productDetail.class);
intent.putExtra("name", name);
intent.putExtra("price", price);
intent.putExtra("image", byteArray);
intent.putExtra("id", id1);
startActivity(intent);
}
}
});
}
}
private class ImageLoadTask extends AsyncTask<String, String, Bitmap>{
Context context;
ImageLoadTask(Context context) {
this.context = context;
}
@Override
protected Bitmap doInBackground(String... strings) {
for(int i = 0 ; i < list1.size() ; i++)
{
if (list1.get(i).getImage()==null);
{
String url=list1.get(i).getUrl();
InputStream is = null;
try {
is = (InputStream) new URL(url).getContent();
} catch (IOException e) {
e.printStackTrace();
}
Bitmap b = BitmapFactory.decodeStream(is);
list1.set(i, new item(list1.get(i).getId(), list1.get(i).getName(), list1.get(i).getPrice(), list1.get(i).getUrl() ,b));
}
}
return null;
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
}
protected void onPostExecute(Bitmap result){
super.onPostExecute(result);
adp = new actorAdapter(context, R.layout.listview, list1);
lv.setAdapter(adp);
adp.notifyDataSetChanged();
}
}
Can I do anything to lazy load image? I tried creating another AsyncTask
, but it shows image when all the images are loaded.
Can I update my ListView
as soon as one image is downloaded?
Please help. Can't figure out on my own. These two problems are stopping me from learning more.
public View getView(int position, View convertView, ViewGroup parent){
inflater= (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
View v =convertView;
if (v == null) {
holder=new ViewHolder();
v=inflater.inflate(Resource,null);
holder.name= (TextView) v.findViewById(R.id.titles);
holder.price= (TextView) v.findViewById(R.id.price);
holder.img= (ImageView) v.findViewById(R.id.itemimage);
v.setTag(holder);
holder.name.setText(list1.get(position).getName());
holder.price.setText((CharSequence) list1.get(position).getPrice());
holder.img.setImageBitmap(list1.get(position).getImage());
}
else {
holder = (ViewHolder) v.getTag();
}
return v;
}