Search code examples
androidlistviewadapterlistadapter

list View set null by adapter


I am getting the data from the server. Then the data will pass to the adapter but it's showing me null.

Here is the error part:

Why I get the data is null?
What is the problem I am getting here?

Please help. Below I attach my Adapter Code and Activity Code.

Here is my Adapter Code:

public class Search_Adapter extends BaseAdapter implements Filterable {
private Context context;
private List<Model_Search.Model_Items> searchList;
private LayoutInflater inflater;
List<Model_Search.Model_Items> mStringFilterList;
ValueFilter valueFilter;


public Search_Adapter(Context context, List<Model_Search.Model_Items> searchList) {
    this.context = context;
    this.searchList = searchList;
    mStringFilterList = searchList;
}

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

public Object getItem(int i) {
    return searchList.get(i);
}

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

public View getView(int i, View view, ViewGroup viewGroup) {
    if (inflater == null) {
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    if (view == null) {
        view = inflater.inflate(R.layout.search_adapter_row, null);
    }

    MyTextView txtShopName = (MyTextView) view.findViewById(R.id.shop_name);
    MyTextView txtItemName = (MyTextView) view.findViewById(R.id.item_name);
    MyTextView txtPrice = (MyTextView) view.findViewById(R.id.item_price);
    ImageView shop_image = (ImageView)view.findViewById(R.id.image);

    final Model_Search.Model_Items model_items = searchList.get(i);
    String shop_name = model_items.getShop_name();
    String item_name = model_items.getItem_name();
    String price = model_items.getItem_price();
    String image = model_items.getImage();

    txtShopName.setText(shop_name);
    txtItemName.setText(item_name);
    txtPrice.setText("₹"+price+"/-");

    view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent in  = new Intent(context, Activity_Shop_Detail.class);
            in.setFlags(FLAG_ACTIVITY_NEW_TASK);
            in.putExtra("shop_id",model_items.getShop_id());
            context.startActivity(in);
        }
    });

    Picasso.with(context)
            .load(Url.url + "profile_photo/" + image).into(shop_image);

    return view;
}

@Override
public Filter getFilter() {
    if (valueFilter == null) {
        valueFilter = new ValueFilter();
    }
    return valueFilter;
}

private class ValueFilter extends Filter {
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        FilterResults results = new FilterResults();

        if (constraint != null && constraint.length() > 0) {
            ArrayList<Model_Search.Model_Items> filterList = new ArrayList<Model_Search.Model_Items>();
            for (int i = 0; i < mStringFilterList.size(); i++) {
                if ((mStringFilterList.get(i).getItem_name().toUpperCase()).contains(constraint.toString().toUpperCase())||
                        (mStringFilterList.get(i).getShop_name().toUpperCase()).contains(constraint.toString().toUpperCase()))
                {
                    Model_Search.Model_Items bean = new Model_Search.Model_Items(mStringFilterList.get(i).getShop_id(),mStringFilterList.get(i).getItem_name(), mStringFilterList.get(i).getItem_price(),
                                                        mStringFilterList.get(i).getShop_name(),mStringFilterList.get(i).getImage());
                    filterList.add(bean);
                }
            }
            results.count = filterList.size();
            results.values = filterList;
        } else {
            results.count = mStringFilterList.size();
            results.values = mStringFilterList;
        }
        return results;
    }

    @Override
    protected void publishResults(CharSequence constraint,
                                  FilterResults results) {
        searchList = (ArrayList<Model_Search.Model_Items>) results.values;
        //notifyDataSetChanged();
    }

}
}

Here is my Activity Code:

public class Activity_Search extends AppCompatActivity implements 
SearchView.OnQueryTextListener {
JSONArray insert_tbl;
List<NameValuePair> detail=new ArrayList<NameValuePair>();
String c_id;
LinearLayout fullLayout;
ProgressBar progressBar;
ArrayList<Model_Search> model_search=new ArrayList<>();
List<Model_Search.Model_Items> model_item=new ArrayList<>();
private ListView lv;
private SearchView sv;
Search_Adapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity__search);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayShowTitleEnabled(false);

    //ActionBar actionBar = getSupportActionBar();
    //actionBar.setDisplayHomeAsUpEnabled(true);

    detail.clear();
    detail.add(new BasicNameValuePair("mode","search"));
    detail.add(new BasicNameValuePair("lat", ""+latitude));
    detail.add(new BasicNameValuePair("long",""+longitude));

    sv = (SearchView) findViewById(R.id.search_view);
    lv = (ListView) findViewById(R.id.lv);

    fullLayout = (LinearLayout) findViewById(R.id.fullLayout);
    progressBar = (ProgressBar)findViewById(R.id.progressBar);

    Fetch_Search_Data f = new Fetch_Search_Data();
    f.execute();

    sv.setOnQueryTextListener(this);
}

@Override
public boolean onQueryTextSubmit(String s) {
    if(!s.isEmpty()){
        lv.setVisibility(View.VISIBLE);
    }else{
        lv.setVisibility(View.INVISIBLE);
    }
    adapter.getFilter().filter(s);
    return false;
}

@Override
public boolean onQueryTextChange(String s) {
    if(!s.isEmpty()){
        lv.setVisibility(View.VISIBLE);
    }else{
        lv.setVisibility(View.INVISIBLE);
    }
    adapter.getFilter().filter(s);
    return false;
}

@Override
public void onBackPressed()
{
    finish();
    super.onBackPressed();
}

class Fetch_Search_Data extends AsyncTask<String, String, String>
{

    @Override
    protected String doInBackground(String... arg0) {
        // TODO Auto-generated method stub

        JsonCall jparse = new JsonCall();
        JSONObject jobj = jparse.getJSONFromUrl("http://grubbasket.com/grubag/api/app/search/"+latitude+"/"+longitude, "GET",detail);

        try {

            model_search.clear();
            if (jobj != null) {
                    insert_tbl = jobj.getJSONArray("data");
                for (int i1 = 0; i1 <= insert_tbl.length(); i1++) {
                    JSONObject s = insert_tbl.getJSONObject(i1);
                    c_id = s.getString("shop_id");
                    //Toast.makeText(Activity_Search.this, c_id, Toast.LENGTH_SHORT).show();
                    if (c_id.matches("0")) {

                    } else {

                        Model_Search m = new Model_Search();
                        m.setShop_id(s.getString("shop_id"));
                        m.setShop_name(s.getString("shop_name"));
                        m.setCuisines(s.getString("cuisines"));
                        m.setImage(s.getString("image"));
                        m.setDistance(s.getString("distance"));

                        for (int j = 0; j < s.getJSONArray("items").length(); j++) {
                            JSONObject s1 = s.getJSONArray("items").getJSONObject(j);

                            Model_Search.Model_Items model_items = new Model_Search.Model_Items();

                            model_items.setShop_id(s1.getString("shop_id"));
                            model_items.setItem_name(s1.getString("item_name"));
                            model_items.setShop_name(s1.getString("shop_name"));
                            model_items.setImage(s1.getString("image"));
                            model_items.setItem_price(s1.getString("price"));

                            model_item.add(model_items);
                        }

                        m.setModel_items(model_item);

                        model_search.add(m);

                    }
                }
        }
        } catch (JSONException e) {

        }
        return null;
    }

    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub

       if(!c_id.equals("null")) {

       } else {
            //Toast.makeText(Activity_Search.this, "Data Retrieved !", Toast.LENGTH_SHORT).show();

            adapter = new Search_Adapter(getApplicationContext(), model_item);
            lv.setAdapter(adapter);
            lv.invalidate();
            lv.setVisibility(View.VISIBLE);
       }

        fullLayout.setVisibility(View.VISIBLE);
        progressBar.setVisibility(View.GONE);

        super.onPostExecute(result);
    }
    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub

        fullLayout.setVisibility(View.GONE);
        progressBar.setVisibility(View.VISIBLE);

        super.onPreExecute();
    }
}
}

this my array response

{"success":true,"message":"Search Results","data":[{"shop_id":"60","uid":"85","shop_name":"The Dugout Cafe & Eatery","address":"Near apple global school","phone":"","locality":"Satellite","city":"Ahmedabad","state":"Gujarat","gst":"0","home_delivery":"NO","min_delivery_charge":"0","delivery_charge_per_km":"0","max_delivery_area_km":"5","website":"YES","website_name":"","cuisines":"cafe, italian, continental","veg":"","avg_cost":"650","min_order":"200","avg_time":"30-45","seating":"","current_status":"ONLINE","cafes":"YES","dinning":"NO","dessert":"YES","bakery":"","hotel":"","resort":"","bar":"","date":"2017-08-08","status":"active","offer_status":"","offer_percent":"0","ordering_status":"No","franchise_id":"0","payment_method":"C.O.D","gst_no":"","data_user":"7","latitude":"24.6011441","longitude":"73.7093526","image":"85.png","distance":4.2261161192851,"items":[{"item_id":"2313","mid":"336","item_name":"Classic French Fries ","description":"description","count":"1","price":"70","stock":"in","status":"active","shop_id":"60"},{"item_id":"2314","mid":"336","item_name":"Garlic Bread ","description":"description","count":"1","price":"80","stock":"in","status":"active","shop_id":"60"},{"item_id":"2315","mid":"336","item_name":"French Bruschetta ","description":"description","count":"1","price":"100","stock":"in","status":"active","shop_id":"60"},{"item_id":"2316","mid":"336","item_name":"Corn Cheese Cigar Rolls ","description":"description","count":"1","price":"100","stock":"in","status":"active","shop_id":"60"},{"item_id":"2317","mid":"336","item_name":"Maxican Cheese Balls ","description":"description","count":"1","price":"120","stock":"in","status":"active","shop_id":"60"},{"item_id":"2318","mid":"336","item_name":"Chicken Nuggets ","description":"description","count":"1","price":"150","stock":"in","status":"active","shop_id":"60"},{"item_id":"2319","mid":"336","item_name":"Fish Fingers ","description":"description","count":"1","price":"190","stock":"in","status":"active","shop_id":"60"},{"item_id":"2320","mid":"336","item_name":"Pesto Grilled Chicken ","description":"description","count":"1","price":"190","stock":"in","status":"active","shop_id":"60"},{"item_id":"2321","mid":"336","item_name":"Crispy Potato Wedges ","description":"description","count":"1","price":"70","stock":"in","status":"active","shop_id":"60"},{"item_id":"2322","mid":"336","item_name":"Cheese Garlic Bread ","description":"description","count":"1","price":"120","stock":"in","status":"active","shop_id":"60"}]},{"shop_id":"30","uid":"54","shop_name":"Bawarchi Restaurant","address":"6 - Delhi Gate, City Centre, Udaipur","phone":"6350000566","locality":"Delhi Gate","city":"Udaipur","state":"Rajasthan","gst":"2","home_delivery":"NO","min_delivery_charge":"0","delivery_charge_per_km":"0","max_delivery_area_km":"5","website":"NO","website_name":"","cuisines":"North Indian, continental","veg":"Veg","avg_cost":"1000","min_order":"150","avg_time":"30-45","seating":"YES","current_status":"OFFLINE","cafes":"NO","dinning":"YES","dessert":"NO","bakery":"NO","hotel":"NO","resort":"NO","bar":"NO","date":"08-09-2018","status":"active","offer_status":"NO","offer_percent":"0","ordering_status":"NO","franchise_id":"0","payment_method":"C.O.D,Online","gst_no":"2","data_user":"490","latitude":"24.5979398","longitude":"73.7097204","image":"54.png","distance":3.8807687984604,"items":[{"item_id":"380","mid":"167","item_name":"Jeera Aloo","description":"description","count":"1","price":"120","stock":"in","status":"active","shop_id":"30"},{"item_id":"381","mid":"167","item_name":"Aloo Tomato","description":"description","count":"1","price":"120","stock":"in","status":"active","shop_id":"30"},{"item_id":"382","mid":"167","item_name":"Aloo Palak","description":"description","count":"1","price":"125","stock":"in","status":"active","shop_id":"30"},{"item_id":"383","mid":"167","item_name":"Aloo Mutter","description":"description","count":"1","price":"120","stock":"in","status":"active","shop_id":"30"},{"item_id":"384","mid":"167","item_name":"Aloo Gobhi","description":"description","count":"1","price":"125","stock":"in","status":"active","shop_id":"30"},{"item_id":"385","mid":"167","item_name":"Gobi Masala","description":"description","count":"1","price":"130","stock":"in","status":"active","shop_id":"30"},{"item_id":"386","mid":"167","item_name":"Bhindi Masala ","description":"description","count":"1","price":"130","stock":"in","status":"active","shop_id":"30"},{"item_id":"387","mid":"167","item_name":"Palak Mutter ","description":"description","count":"1","price":"125","stock":"in","status":"active","shop_id":"30"},{"item_id":"388","mid":"167","item_name":"Aloo Palak","description":"description","count":"1","price":"125","stock":"in","status":"active","shop_id":"30"},{"item_id":"389","mid":"167","item_name":"Palak Corn ","description":"description","count":"1","price":"125","stock":"in","status":"active","shop_id":"30"}]}]}

Solution

  • I found the actual problem. The problem is here

    model_items.setImage(s1.getString("image"));
    model_items.setShop_name(s1.getString("shop_name"));
    

    In this line, you can try to get an image from s1 object but in s1 has no field of image. That's why it throws an exception.

    Remove this line and try again.