Search code examples
androidlistviewbaseadaptercustom-adapteronscrolllistener

Custom adapter never empty


I've custom adapter that populates custom listview with data fetched from server. What I want is check if adapter is empty and append data to listview if it is empty else fill the listview with data and notifyDataSetChanged. I'm implementing OnScrollListener to load more data from server. But adapter never is empty and always notifyDataSetChanged is called.

My List Activity

public class ListResultActivity extends Activity implements OnScrollListener{

private ArrayList<BusinessListData> businesses;
private ListView businessList;
private LayoutInflater layoutInflator;
private BusinessListIconTask imgFetcher;
BusinessListDataAdapter adapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.businesslist);
    this.businessList = (ListView) findViewById(R.id.lvBusinesslist);
    this.adapter= new BusinessListDataAdapter(this,
            this.imgFetcher, this.layoutInflator, this.businesses);     
    getData();

    businessList.setOnScrollListener(this);
}

@Override
public Object onRetainNonConfigurationInstance() {
    Object[] myStuff = new Object[2];
    myStuff[0] = this.businesses;
    myStuff[1] = this.imgFetcher;
    return myStuff;
}

/**
 * Bundle to hold refs to row items views.
 * 
 */
public static class MyViewHolder {
    public TextView businessName, businessAddress, phoneNo;
    public Button btnProfile;
    public ImageView icon;
    public BusinessListData business;
}

public void setBusinesses(ArrayList<BusinessListData> businesses) {

    this.imgFetcher = new BusinessListIconTask(this);
    this.layoutInflator = LayoutInflater.from(this);
    this.businesses = businesses;
    if(adapter !=null){
        this.adapter.notifyDataSetChanged();
    }else{
        this.adapter= new BusinessListDataAdapter(this,
                this.imgFetcher, this.layoutInflator, this.businesses);
        businessList.setAdapter(adapter);

    }
}

private void getData() {
    // TODO Auto-generated method stub
    Intent myIntent = getIntent();

    // gets the arguments from previously created intent
    String metroTxt = myIntent.getStringExtra("key");
    String metroLoc = myIntent.getStringExtra("loc");
    String metroId = myIntent.getStringExtra("qt");

    BusinessListApiTask spTask = new BusinessListApiTask(
            ListResultActivity.this);

    try {
        spTask.execute(metroTxt, metroLoc, metroId);

    } catch (Exception e) {
        spTask.cancel(true);
    }
}

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
    // TODO Auto-generated method stub

}

@Override
public void onScroll(AbsListView view, int firstVisibleItem,
        int visibleItemCount, int totalItemCount) {
    // TODO Auto-generated method stub
    if (businessList.getLastVisiblePosition() == totalItemCount - 1) {
        getData();          
        adapter.notifyDataSetChanged();
        Log.d("test count", "abc"+totalItemCount);
    }

}

}

Class to fetch data from server and set to adapter

public class BusinessListApiTask extends AsyncTask<String, Integer, String> {
private ProgressDialog progDialog;
private Context context;
private ListResultActivity activity;
private static final String debugTag = "sodhpuch";
HashMap<String, String> queryValues;

/**
 * Construct a task
 * 
 * @param activity
 */

public BusinessListApiTask(ListResultActivity activity) {
    // TODO Auto-generated constructor stub
    super();
    this.activity = activity;
    this.context = this.activity.getApplicationContext();
}

@Override
protected void onPreExecute() {
    super.onPreExecute();
    progDialog = ProgressDialog.show(this.activity, "Search", this.context
            .getResources().getString(R.string.looking_for_business), true,
            false);
}

@Override
protected String doInBackground(String... params) {
    try {
        // Log.d(debugTag, "Background:" +
        // Thread.currentThread().getName());
        String result = BusinessListHelper.downloadFromServer(params);
        // try {
        //
        // updateSQLite(result);
        //
        // } catch (Exception e) {
        // return result;
        // }
        Log.d("result", result);
        return result;

    } catch (Exception e) {
        return new String();
    }
}

@Override
protected void onPostExecute(String result) {

    ArrayList<BusinessListData> businessData = new ArrayList<BusinessListData>();

    progDialog.dismiss();
    try {

        JSONObject respObj = new JSONObject(result);
        int success = respObj.getInt("success");
        Log.d("Success", "abc"+success);
        if (success == 1) {

            JSONArray tracks = respObj.getJSONArray("idioms");
            for (int i = 0; i < tracks.length(); i++) {
                JSONObject track = tracks.getJSONObject(i);
                String businessName = track.getString("name");
                String businessAddress = track.getString("address");
                String phone = track.getString("phone");
                String id = track.getString("id");
                String deals_in = track.getString("deals_in");
                businessData.add(new BusinessListData(businessName,
                        businessAddress, id, phone, deals_in));
            }   

        } else {

            Log.d("Success", "first"+success);
            // Log.d(debugTag, "Background:" + result);
            // DBController controller = new DBController(context);
            // businessData = controller.getBusinessList();
            return ;

        }

    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    // }
    this.activity.setBusinesses(businessData);

}

My Adapter

public class BusinessListDataAdapter extends BaseAdapter implements
    OnClickListener {

private static final String debugTag = "BusinessListDataAdapter";
private ListResultActivity activity;
private BusinessListIconTask imgFetcher;
private LayoutInflater layoutInflater;
private ArrayList<BusinessListData> businesses;
BusinessListData business;

public BusinessListDataAdapter(ListResultActivity a,
        BusinessListIconTask i, LayoutInflater l,
        ArrayList<BusinessListData> data) {
    this.activity = a;
    this.imgFetcher = i;
    this.layoutInflater = l;
    this.businesses = data;

}


@Override
public int getCount() {
    return this.businesses.size();
}
public void clear()
{
    businesses.clear();
    notifyDataSetChanged();
}

@Override
public boolean areAllItemsEnabled() {
    return true;
}

@Override
public Object getItem(int arg0) {
    return null;
}

@Override
public long getItemId(int pos) {
    return pos;
}

@Override
public View getView(int pos, View convertView, ViewGroup parent) {
    MyViewHolder holder;
    if (convertView == null) {
        convertView = layoutInflater.inflate(R.layout.trackrow, parent,
                false);
        holder = new MyViewHolder();
        holder.businessName = (TextView) convertView
                .findViewById(R.id.tvBusinessName);
        holder.businessAddress = (TextView) convertView
                .findViewById(R.id.tvAddress);
        holder.phoneNo = (TextView) convertView.findViewById(R.id.tvPhone);
        holder.icon = (ImageView) convertView.findViewById(R.id.album_icon);
        holder.btnProfile = (Button) convertView
                .findViewById(R.id.btnProfile);
        holder.btnProfile.setTag(holder);
        convertView.setTag(holder);
    } else {
        holder = (MyViewHolder) convertView.getTag();
    }

    convertView.setOnClickListener(this);

    business= businesses.get(pos);
    holder.business = business;
    holder.businessName.setText(business.getName());
    holder.businessAddress.setText(business.getAddress());
    holder.phoneNo.setText(business.getPhone());
    holder.btnProfile.setOnClickListener(this);


    // if(track.getImageUrl() != null) {
    // holder.icon.setTag(track.getImageUrl());
    // Drawable dr = imgFetcher.loadImage(this, holder.icon);
    // if(dr != null) {
    // holder.icon.setImageDrawable(dr);
    // }
    // } else {
    holder.icon.setImageResource(R.drawable.filler_icon);
    // }

    return convertView;
}
@Override
public void onClick(View v) {
    String deals_in = business.getDeals().toString();
    Log.d("name", deals_in);
    MyViewHolder holder = (MyViewHolder) v.getTag();
    if (v instanceof Button) {

        Intent profile = new Intent(activity,
                ProfileActivity.class);
        profile.putExtra("deals_in", deals_in);
        profile.putExtra("phone", holder.business.getPhone());
        profile.putExtra("address", holder.business.getAddress());
        profile.putExtra("name", holder.business.getName());
        this.activity.startActivity(profile);

    } else if (v instanceof View) {
        Log.d("test","call testing");
        Intent intent = new Intent(Intent.ACTION_CALL);
           intent.setData(Uri.parse("tel:" +holder.business.getPhone()));
           this.activity.startActivity(intent);
    }
    Log.d(debugTag, "OnClick pressed.");

}

}


Solution

  • Try this way,hope this will help you to solve your problem.

    public void setBusinesses(ArrayList<BusinessListData> businesses) {
        imgFetcher = new BusinessListIconTask(this);
        layoutInflator = LayoutInflater.from(this);
        if(this.businesses == null || adapter==null){
          this.businesses = new ArrayList<BusinessListData>();
          adapter= new BusinessListDataAdapter(this,imgFetcher,layoutInflator,this.businesses);
          businessList.setAdapter(adapter);
        }
        this.businesses.addAll(businesses);
        adapter.notifyDataSetChanged();
    }