Custom adapter getting a NullPointerException with Inflator - android

I have an adapter that gets a list of items from an API and then puts it in a listview. This is the first time that Im working with adapters and list views and so far Im struggling quite a lot!
Why am I getting this error? Is my context wrong or something?
package com.example.tvrplayer;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class HiddenChannelsListAdapter extends BaseAdapter {
private Context mContext;
private ArrayList mItems;
private LayoutInflater mInflater;
public HiddenChannelsListAdapter(Context ctx, ArrayList list) {
mItems = list;
mContext = ctx;
mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
#Override
public int getCount() {
return mItems.size();
}
#Override
public HashMap getItem(int position) {
return (HashMap) mItems.get(position);
}
#Override
public long getItemId(int position) {
return position;
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("getView " + position + " " + convertView);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.channel_item, parent, false);
} else {
((TextView) convertView.findViewById(R.id.channel_text)).setText("Testing");
}
return convertView;
}
public static class ViewHolder {
public TextView textView;
}
}
Asyntask to get the items from the server:
package com.example.tvrplayer;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
class ChannelPair {
public ListView lv;
public ArrayList channelList;
public Context ctx;
}
public class ChannelHandler extends AsyncTask<Object, Integer, ChannelPair> {
#Override
protected ChannelPair doInBackground(Object... params) {
ChannelPair p = new ChannelPair();
String apiurl = (String) params[0];
String linkid = (String) params[1];
String username = (String) params[2];
String channelID = null;
View vw = (View) params[3];
ListView lv = (ListView) vw.findViewById(R.id.list);
p.lv = lv;
JSONArray channels;
ArrayList< HashMap < String, String > > channelList = new ArrayList < HashMap < String, String > > ();
try {
channels = Json.getJson(apiurl + "/rest/channel/"+ username +"/"+ linkid, "GET");
Log.i("CHANNELS", channels.toString());
for (int i=0; i < channels.length(); i++) {
JSONObject json_data = channels.getJSONObject(i);
String name = json_data.getString("Name");
String channelid = json_data.getString("ChannelID");
HashMap<String, String> channelObject = new HashMap<String, String>();
// if ( json_data.getString("ParentPath") == "" ) {
channelObject.put("id", channelid);
channelObject.put("name", name);
channelList.add(channelObject);
// }
}
Log.i("ROOT CHANNELS", channelList.toString());
p.channelList = channelList;
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return p;
}
#Override
protected void onPostExecute(final ChannelPair p) {
HiddenChannelsListAdapter adapter = new HiddenChannelsListAdapter(p.ctx, p.channelList);
p.lv.setAdapter(adapter);
}
}
The error is in this line:
HiddenChannelsListAdapter.java:28
mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
The full error code:
java.lang.NullPointerException
at com.example.tvrplayer.HiddenChannelsListAdapter.<init>(HiddenChannelsListAdapter.java:28)
at com.example.tvrplayer.ChannelHandler.onPostExecute(ChannelHandler.java:71)
at com.example.tvrplayer.ChannelHandler.onPostExecute(ChannelHandler.java:1)
at android.os.AsyncTask.finish(AsyncTask.java:602)
at android.os.AsyncTask.access$600(AsyncTask.java:156)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4514)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
at dalvik.system.NativeStart.main(Native Method)

Related

I got "IndexOutOfBoundsException" when I try to drag down a row from my ListView (using DragSortListView)

I saw a tutorial on youtube showing how you can add data to sqlLite db and then display these data to a ListView Video.
After doing that... I applied DragSortListView to my listview... but everytime I drag a row. This error keeps on coming and I couldn't solve it :
FATAL EXCEPTION: main
Process: com.example.justi.ricksonbar, PID: 29157
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.get(ArrayList.java:411)
at com.example.justi.ricksonbar.ProductAdapter.getItem(ProductAdapter.java:49)
at com.example.justi.ricksonbar.BackgroundTask$1.drop(BackgroundTask.java:91)
at com.mobeta.android.dslv.DragSortListView.dropFloatView(DragSortListView.java:1501)
at com.mobeta.android.dslv.DragSortListView.access$1200(DragSortListView.java:59)
at com.mobeta.android.dslv.DragSortListView$DropAnimator.onStop(DragSortListView.java:1293)
at com.mobeta.android.dslv.DragSortListView$SmoothAnimator.run(DragSortListView.java:1192)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Here's my ProductAdapter.java¨
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.TextView;
import com.mobeta.android.dslv.DragSortController;
import com.mobeta.android.dslv.DragSortListView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ProductAdapter extends ArrayAdapter{
List list = new ArrayList();
public ProductAdapter(Context context,int resource) {
super(context, resource);
}
public void add(Product object) {
list.add(object);
super.add(object);
}
#Override
public int getCount() {
return list.size();
}
#Override
public Object getItem(int position) {
return list.get(position);
}
#Override
public View getView(int position, final View convertView, ViewGroup parent) {
View row = convertView;
final ProductHolder productHolder;
if(row == null){
LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = layoutInflater.inflate(R.layout.product_list, parent, false);
productHolder = new ProductHolder();
productHolder.tx_name = (TextView)row.findViewById(R.id.tvProd_name);
productHolder.tx_price = (TextView)row.findViewById(R.id.tvProd_price);
productHolder.tx_type = (TextView)row.findViewById(R.id.tvProd_type);
row.setTag(productHolder);
}else{
productHolder = (ProductHolder) row.getTag();
}
Product product = (Product) getItem(position);
productHolder.tx_name.setText(product.getName().toString());
productHolder.tx_price.setText(Double.toString(product.getPrice()));
productHolder.tx_type.setText(product.getType().toString());
return row;
}
static class ProductHolder{
TextView tx_name, tx_price, tx_type;
}
}
and my BackgroundTask.java (where I put DragSortListView methods)
import android.app.Activity;
import android.app.VoiceInteractor;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.AsyncTask;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.mobeta.android.dslv.DragSortController;
import com.mobeta.android.dslv.DragSortListView;
public class BackgroundTask extends AsyncTask<String, Product, String> {
Context ctx;
ProductAdapter productAdapter;
Activity activity;
DragSortListView listView;
BackgroundTask(Context ctx){
this.ctx = ctx;
activity = (Activity)ctx;
}
#Override
protected void onPreExecute() {
super.onPreExecute();
}
#Override
protected String doInBackground(String... params) {
String method = params[0];
DatabaseHelper dHelper = new DatabaseHelper(ctx);
if (method.equals("add_info")){
String name = params[1];
double price = Double.parseDouble(params[2]);
String type = params[3];
SQLiteDatabase db = dHelper.getWritableDatabase();
//Call method of insertion
dHelper.addInformations(db, name, price, type);
return "One row is inserted....";
}else if (method.equals("get_info")){
listView = (DragSortListView)activity.findViewById(R.id.display_listview);
SQLiteDatabase db = dHelper.getReadableDatabase();
Cursor cursor = dHelper.getInformations(db);
productAdapter = new ProductAdapter(ctx,R.layout.product_list);
String name, type;
double price;
while (cursor.moveToNext()){
name = cursor.getString(cursor.getColumnIndex(ProductContract.ProductEntry.NAME));
price = cursor.getDouble(cursor.getColumnIndex(ProductContract.ProductEntry.PRICE));
type = cursor.getString(cursor.getColumnIndex(ProductContract.ProductEntry.TYPE));
Product product = new Product(name, price, type);
publishProgress(product);
}
return "get_info";
}
return null;
}
#Override
protected void onProgressUpdate(Product... values) {
productAdapter.add(values[0]);
}
private DragSortListView.DropListener onDrop = new DragSortListView.DropListener()
{
#Override
public void drop(int from, int to)
{
productAdapter = new ProductAdapter(ctx,R.layout.product_list);
if (from != to)
{
Object item = productAdapter.getItem(from);
productAdapter.remove(item);
productAdapter.insert(item, to);
}
}
};
private DragSortListView.RemoveListener onRemove = new DragSortListView.RemoveListener()
{
#Override
public void remove(int which)
{
productAdapter = new ProductAdapter(ctx,R.layout.product_list);
productAdapter.remove(productAdapter.getItem(which));
}
};
#Override
protected void onPostExecute(String result) {
if (result.equals("get_info")){
listView.setAdapter(productAdapter);
listView.setDropListener(onDrop);
listView.setRemoveListener(onRemove);
DragSortController controller = new DragSortController(listView);
controller.setRemoveEnabled(false);
controller.setSortEnabled(true);
controller.setDragInitMode(1);
listView.setFloatViewManager(controller);
listView.setOnTouchListener(controller);
listView.setDragEnabled(true);
}else{
Toast.makeText(ctx, result, Toast.LENGTH_LONG).show();
}
}
}
Please help me. Thank you so much
You are trying to fetch item before adding any element in a adapter.
#Override
public void drop(int from, int to)
{ // Adapter is Created here
productAdapter = new ProductAdapter(ctx,R.layout.product_list);
if (from != to)
{
// here you are trying to get item which must throw indexoutofbounds
// because you didn't added anything yet
Object item = productAdapter.getItem(from);
productAdapter.remove(item);
productAdapter.insert(item, to);
}
}
According to your add method of your adapter will add elements in Adapter.
public void add(Product object) {
list.add(object);
super.add(object);
}
Use Cursor Adapter, it is more efficient:
https://guides.codepath.com/android/Populating-a-ListView-with-a-CursorAdapter

Listview refresh while fetching data from server

I have been working on an android project where I need to fetch data from server and display in a listview. The first retrieval is done successfully but from second retrieval onwards the fetched data's are placed below the previously fetched data. How can I refresh the listview to view the fetched data in the listview? The codes I used are given below.
package com.example.sohan.patient;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Sohan on 5/20/2016.
*/
public class Doctors_layout extends Fragment implements AdapterView.OnItemSelectedListener{
View myView;
Spinner spinner;
String selectedCity;
Context myContext;
String jsonResult;
JSONObject jsonObject;
JSONArray jsonArray;
ContactAdapter contactAdapter;
String JSON_String;
ListView listView;
Button button;
int check=0;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
myView = inflater.inflate(R.layout.doctors_directory, container, false);
myContext = inflater.getContext();
contactAdapter = new ContactAdapter(myContext, R.layout.row_layout);
spinner = (Spinner)myView.findViewById(R.id.spinner);
listView = (ListView)myView.findViewById(R.id.listView);
listView.setAdapter(contactAdapter);
spinner.setOnItemSelectedListener(this);
List<String> city = new ArrayList<String>();
city.add("Choose a City");
city.add("Chittagong");
city.add("Dhaka");
ArrayAdapter<String> aAdapter = new ArrayAdapter<String>(myContext, android.R.layout.simple_spinner_item ,city);
aAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(aAdapter);
return myView;
}
#Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
//contactAdapter.notifyDataSetChanged();
if(check==0) {
((TextView) parent.getChildAt(0)).setTextSize(21);
if (position == 0) {
nothing();
} else {
check++;
selectedCity = parent.getItemAtPosition(position).toString();
Toast.makeText(myContext, "Check value: "+check, Toast.LENGTH_LONG).show();
retrieveInfo ri = new retrieveInfo();
ri.execute(selectedCity); // notifydata
}
}
else{
contactAdapter.notifyDataSetChanged();
selectedCity = parent.getItemAtPosition(position).toString();
retrieveInfo ri = new retrieveInfo();
ri.execute(selectedCity);
}
}
#Override
public void onNothingSelected(AdapterView<?> parent) {
}
public void nothing(){
//Toast.makeText(myContext, "Default position 0", Toast.LENGTH_LONG).show();
}
class retrieveInfo extends AsyncTask<String, Void, String> { // send data to server
String myUrl;
protected void onPreExecute() {
myUrl ="http://bdpricelist.com/patient/retrieveMedicalName.php"; // change php script
}
protected String doInBackground(String... args) {
String city;
String result = null;
city = args[0];
JSONArray jsonArray = null;
try{
URL url = new URL(myUrl);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setDoOutput(true);
OutputStream outputStream = httpURLConnection.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
String data_to_send = URLEncoder.encode("city", "UTF-8")+"="+URLEncoder.encode(city,"UTF-8");
bufferedWriter.write(data_to_send);
bufferedWriter.flush();
bufferedWriter.close();
outputStream.close();
InputStream is = httpURLConnection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"), 8);
StringBuilder sb = new StringBuilder();
while ((JSON_String = reader.readLine()) != null)
{
sb.append(JSON_String+"\n");
}
reader.close();
httpURLConnection.disconnect();
is.close();
return sb.toString().trim();
}catch(MalformedURLException e){
e.printStackTrace();
}catch(IOException f){
f.printStackTrace();
}
return null;
}
protected void onPostExecute(String result) {
jsonResult = result;
parseJSON(jsonResult);
//jsonResult="";
}
}
public void delete(String city) {
Fragment Dl = new Doctors_layout();
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.content_frame, Dl);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
public void parseJSON(String json){
Contacts contacts=null;
try {
jsonObject = new JSONObject(json);
jsonArray = jsonObject.getJSONArray("patient");
int count = 0;
String name;
while (count < jsonArray.length()) {
JSONObject jo = jsonArray.getJSONObject(count);
name = jo.getString("Medical"); // data's are send to store in and print in listview
contacts = new Contacts(name);
contactAdapter.add(contacts);
count++;
}
//contactAdapter.add(contacts.getMedicalName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
And my adapter class is given below
package com.example.sohan.patient;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Sohan on 6/9/2016.
*/
public class ContactAdapter extends ArrayAdapter {
//ContactHolder contactHolder;
List list = new ArrayList();
ContactAdapter contactAdapter;
List receivedList = new ArrayList();
View row;
ContactHolder contactHolder;
int count =0;
public ContactAdapter(Context context, int resource) {
super(context, resource);
}
public void add(Contacts object) {
// list.clear();
super.add(object);
list.add(object);
//notifyDataSetChanged();
Toast.makeText(getContext().getApplicationContext(), "Entry without delete ", Toast.LENGTH_SHORT).show();
}
#Override
public int getCount() {
return list.size();
}
#Override
public void clear() {
super.clear();
}
#Override
public boolean isEmpty() {
return super.isEmpty();
}
#Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
}
public void deleteEntry(){
list.clear();
Toast.makeText(getContext().getApplicationContext(), "List cleared before entry ", Toast.LENGTH_SHORT).show();
}
#Override
public Object getItem(int position) {
return list.get(position);
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
//count++;
row = convertView;
if(row==null){
LayoutInflater layoutInflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = layoutInflater.inflate(R.layout.row_layout,parent,false);
contactHolder = new ContactHolder();
contactHolder.MedicalName =(TextView) row.findViewById(R.id.textView5);
row.setTag(contactHolder);
}
else{
contactHolder = (ContactHolder)row.getTag();
}
contactHolder = new ContactHolder();
contactHolder.MedicalName =(TextView) row.findViewById(R.id.textView5);
Contacts contacts = (Contacts)this.getItem(position);
contactHolder.MedicalName.setText(contacts.getMedicalName());
return row;
}
static class ContactHolder{
TextView MedicalName;
}
}
Instead of having add(Contacts object) in your adapter, have a method where you clear the current items in the list and update with the newly retrieved items.
private void updateContactList(List<Contacts> updatedList) {
list.clear();
list.addAll(updatedList);
notifyDataSetChanged();
}
and inside parseJSON(String json)
List<Contacts> newList = new ArrayList<>();
while (count < jsonArray.length()) {
JSONObject jo = jsonArray.getJSONObject(count);
name = jo.getString("Medical");
contacts = new Contacts(name);
newList.add(contacts);
count++;
}
contactAdapter.updateContactList(newList);
The new data is being shown after the old data because you are adding new data to the existing one in parseJSON().
If you want to replace the old data with new one then remove these lines from onCreateView and add inside parseJSON(), right after while loop.
contactAdapter = new ContactAdapter(myContext, R.layout.row_layout);
listView.setAdapter(contactAdapter);

GridView doesn't show anything after JSON parsing the values into its items

I have gridview for a tab in tabLayout. I load the values from mysql database to fill the textviews of gridview. I see that the JSON parsing runs correctly and returns correct JSON result. But nothing shows up in grid view.
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.mysampleapp.R;
import java.util.ArrayList;
public class GridAdapterStores extends BaseAdapter {
private Context context;
private ArrayList<String> storename=new ArrayList<String>();
private ArrayList<Integer> imagelinks=new ArrayList<Integer>();
public GridAdapterStores(Context c,ArrayList<String> storename, ArrayList<Integer> imagelinks) {
context = c;
this.imagelinks = imagelinks;
this.storename = storename;
}
#Override
public int getCount() {
return storename.size();
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
public View getView(int position, View convertView, ViewGroup parent){
View grid;
if (convertView == null) {
grid = new View(context);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
grid = inflater.inflate(R.layout.grid_stores,parent,false);
}
else {
grid = (View) convertView;
}
TextView textViewStoreName = (TextView) grid.findViewById(R.id.store_name);
ImageView imageViewStoreImage = (ImageView) grid.findViewById(R.id.store_image);
textViewStoreName.setText(storename.get(position));
Integer x=imagelinks.get(position);
imageViewStoreImage.setImageResource(x);
return grid;
}
}
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.support.v4.app.Fragment;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.Toast;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.widget.AdapterView.OnItemClickListener;
import android.view.View.OnClickListener;
import com.mysampleapp.R;
import java.util.ArrayList;
public class StoresFragment extends Fragment {
private ProgressDialog loading;
private ArrayList<String> storenamefinal=new ArrayList<String>();
private ArrayList<Integer> imagelinksfinal=new ArrayList<Integer>();
#Nullable
#Override
public View onCreateView(LayoutInflater inflater , ViewGroup container,Bundle savedInstanceState){
return inflater.inflate(R.layout.stores_layout,null);
}
#Override
public void onViewCreated(final View view, final Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);
GridView gridview=(GridView) getActivity().findViewById(R.id.grid_stores);
getData();
final GridAdapterStores gridadapter= new GridAdapterStores(getActivity(),storenamefinal,imagelinksfinal);
gridview.setAdapter(gridadapter);
gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
/* Intent i=new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(gridadapter.getItem(position).getImageUrlString()));
startActivity(i);}});*/
// Toast.makeText(getActivity(), "You Clicked at " + cat[+position], Toast.LENGTH_SHORT).show();
Intent i = new Intent(getActivity(), stores_show.class);
i.putExtra("storename", storenamefinal.get(position));
getActivity().startActivity(i);
}
});
}
//public class getData extends AsyncTask<String,>>{
//}
private void getData() {
loading = ProgressDialog.show(getActivity(), "Please wait...", "Fetching...", false, false);
String url = Config1.DATA_URL;
Toast.makeText(getActivity(), url, Toast.LENGTH_LONG).show();
StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() {
#Override
public void onResponse(String response) {
loading.dismiss();
showJSON(response);
}
},
new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getActivity(),error.getMessage().toString(),Toast.LENGTH_LONG).show();
}
});
RequestQueue requestQueue = Volley.newRequestQueue(getActivity());
requestQueue.add(stringRequest);
}
private void showJSON(String response) {
try {
JSONObject jsonObject = new JSONObject(response);
JSONArray result = jsonObject.getJSONArray(Config1.JSON_ARRAY);
Toast.makeText(getActivity(),result.toString(),Toast.LENGTH_LONG).show();
int i=result.length();
Log.i("Result Length",result.toString());
for(int j=0;j<i;j++){
storenamefinal.add(null);
imagelinksfinal.add(null);
}
String temp;
for(int j=0;j<i;j++)
{
JSONObject Data = result.getJSONObject(j);
Log.i("Data",Data.toString());
temp= (Data.getString(Config1.KEY_PRIO));
Log.i("temp", temp.toString());
storenamefinal.set(Integer.parseInt(temp) - 1, Data.getString(Config1.KEY_NAME));
Log.i("Result Length", storenamefinal.toString());
imagelinksfinal.add(R.drawable.sg1);
}
Log.i("Result Length", storenamefinal.toString());
Toast.makeText(getActivity(),storenamefinal.get(0),Toast.LENGTH_LONG).show();
} catch (JSONException e) {
e.printStackTrace();
}
}
}
I have tried searching on Google and stackoverflow , found nothing successful,
{"result":[{"storename":"Flipkart.com","imagelinks":"","mainpriority":"2"},{"storename":"Jabong.com","imagelinks":"","mainpriority":"4"},{"storename":"Myntra.com","imagelinks":"","mainpriority":"5"},{"storename":"Amazon.in","imagelinks":"","mainpriority":"1"},{"storename":"Snapdeal.com","imagelinks":"","mainpriority":"3"},{"storename":"Koovs.in","imagelinks":"","mainpriority":"6"},{"storename":"Limeroad.com","imagelinks":"","mainpriority":"7"},{"storename":"Shopperstop.com","imagelinks":"","mainpriority":"8"},{"storename":"Stalkbuylove.com","imagelinks":"","mainpriority":"9"},{"storename":"Yepme.com","imagelinks":"","mainpriority":"10"},{"storename":"Faballey.com","imagelinks":"","mainpriority":"11"},{"storename":"Fabindia.com ","imagelinks":"","mainpriority":"12"},{"storename":"PrettySecrets.com","imagelinks":"","mainpriority":"13"},{"storename":"AmericanSwan.com","imagelinks":"","mainpriority":"14"},{"storename":"Clovia.com","imagelinks":"","mainpriority":"15"},{"storename":"Bata.in","imagelinks":"","mainpriority":"16"},{"storename":"TrendyBharat.com","imagelinks":"","mainpriority":"17"},{"storename":"Royzez.com","imagelinks":"","mainpriority":"18"}]}
`
Storenamefinal will have entries of storenames from resulting JSON(above)
I tried your code and it crashes the application
after debugging i got that the problem is with the image resources
when i commented below two lines the app works fine.
//check these resources
Integer x=imagelinks.get(position);
imageViewStoreImage.setImageResource(x);
your showJSON() function that i tried
private void showJSON() {
try {
String response ="{\"result\":[{\"storename\":\"Flipkart.com\",\"imagelinks\":\"\",\"mainpriority\":\"2\"},{\"storename\":\"Jabong.com\",\"imagelinks\":\"\",\"mainpriority\":\"4\"},{\"storename\":\"Myntra.com\",\"imagelinks\":\"\",\"mainpriority\":\"5\"},{\"storename\":\"Amazon.in\",\"imagelinks\":\"\",\"mainpriority\":\"1\"},{\"storename\":\"Snapdeal.com\",\"imagelinks\":\"\",\"mainpriority\":\"3\"},{\"storename\":\"Koovs.in\",\"imagelinks\":\"\",\"mainpriority\":\"6\"},{\"storename\":\"Limeroad.com\",\"imagelinks\":\"\",\"mainpriority\":\"7\"},{\"storename\":\"Shopperstop.com\",\"imagelinks\":\"\",\"mainpriority\":\"8\"},{\"storename\":\"Stalkbuylove.com\",\"imagelinks\":\"\",\"mainpriority\":\"9\"},{\"storename\":\"Yepme.com\",\"imagelinks\":\"\",\"mainpriority\":\"10\"},{\"storename\":\"Faballey.com\",\"imagelinks\":\"\",\"mainpriority\":\"11\"},{\"storename\":\"Fabindia.com \",\"imagelinks\":\"\",\"mainpriority\":\"12\"},{\"storename\":\"PrettySecrets.com\",\"imagelinks\":\"\",\"mainpriority\":\"13\"},{\"storename\":\"AmericanSwan.com\",\"imagelinks\":\"\",\"mainpriority\":\"14\"},{\"storename\":\"Clovia.com\",\"imagelinks\":\"\",\"mainpriority\":\"15\"},{\"storename\":\"Bata.in\",\"imagelinks\":\"\",\"mainpriority\":\"16\"},{\"storename\":\"TrendyBharat.com\",\"imagelinks\":\"\",\"mainpriority\":\"17\"},{\"storename\":\"Royzez.com\",\"imagelinks\":\"\",\"mainpriority\":\"18\"}]} ";
JSONObject jsonObject = new JSONObject(response);
JSONArray result = jsonObject.getJSONArray("result");
Toast.makeText(MainActivity.this, result.toString(), Toast.LENGTH_LONG).show();
int i=result.length();
Log.i("Result Length", result.toString());
for(int j=0;j<i;j++){
storenamefinal.add(null);
imagelinksfinal.add(null);
}
String temp;
for(int j=0;j<i;j++)
{
JSONObject Data = result.getJSONObject(j);
Log.i("Data",Data.toString());
temp= (Data.getString("mainpriority"));
Log.i("temp", temp.toString());
storenamefinal.set(Integer.parseInt(temp) - 1, Data.getString("storename"));
Log.i("Result Length", storenamefinal.toString());
imagelinksfinal.add(R.drawable.ic_launcher);
}
Log.i("Result Length", storenamefinal.toString());
Toast.makeText(MainActivity.this,storenamefinal.get(0),Toast.LENGTH_LONG).show();
} catch (JSONException e) {
e.printStackTrace();
}
}
GridAdapterStores.java file
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
/**
* Created by mithilesh.izardar on 6/17/2016.
*/
public class GridAdapterStores extends BaseAdapter {
private Context context;
private ArrayList<String> storename=new ArrayList<String>();
private ArrayList<Integer> imagelinks=new ArrayList<Integer>();
public GridAdapterStores(Context c,ArrayList<String> storename, ArrayList<Integer> imagelinks) {
context = c;
this.imagelinks = imagelinks;
this.storename = storename;
}
#Override
public int getCount() {
return storename.size();
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
public View getView(int position, View convertView, ViewGroup parent){
View grid;
if (convertView == null) {
grid = new View(context);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
grid = inflater.inflate(R.layout.grid_stores,parent,false);
}
else {
grid = (View) convertView;
}
TextView textViewStoreName = (TextView) grid.findViewById(R.id.store_name);
ImageView imageViewStoreImage = (ImageView) grid.findViewById(R.id.store_image);
textViewStoreName.setText(storename.get(position));
// Integer x=imagelinks.get(position);
// imageViewStoreImage.setImageResource(x);
return grid;
}
Happy Coding :)

Populating JSON to android Listview

I got this error while the running the app:
05-10 01:44:39.243 11047-11047/com.efe.efeAlumni E/AndroidRuntime: FATAL EXCEPTION: main Process: com.efe.efeAlumni, PID: 11047 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.efe.efeAlumni/com.efe.efeAlumni.ui.MainActivity}: java.lang.NullPointerException: Attempt to get length of null array at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) at android.app.ActivityThread.access$800(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) Caused by: java.lang.NullPointerException: Attempt to get length of null array at com.efe.efeAlumni.Adaptors.JobAdaptor.getCount(JobAdaptor.java:28) at android.widget.ListView.setAdapter(ListView.java:487) at android.app.ListActivity.setListAdapter(ListActivity.java:265) at com.efe.efeAlumni.ui.MainActivity.onCreate(MainActivity.java:74) at android.app.Activity.performCreate(Activity.java:5990) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) at android.app.ActivityThread.access$800(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
MainActivity:
import android.app.ListActivity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
package com.efe.efeAlumni.ui;
import android.app.ListActivity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.util.Log;
import com.efe.efeAlumni.Adaptors.JobAdaptor;
import com.efe.efeAlumni.Model.Config;
import com.efe.efeAlumni.Model.JobDetails;
import com.efe.efeAlumni.Model.Jobs;
import com.efe.efeAlumni.R;
import com.squareup.okhttp.Call;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
public class MainActivity extends ListActivity {
public static final String TAG = MainActivity.class.getSimpleName();
private Jobs mJobs;
private JobDetails[] mJobDetails;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getJobsDetails();
JobAdaptor adaptor = new JobAdaptor(this, mJobDetails);
setListAdapter(adaptor);
Log.d(TAG," OkHttp success ");
}
private void getJobsDetails() {
if(isNetworkAvailable()) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(Config.jobsURL)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
#Override
public void onFailure(Request request, IOException e) {
}
#Override
public void onResponse(Response response) throws IOException {
try {
String jsonData = response.body().string();
Log.v(TAG, jsonData);
if (response.isSuccessful()) {
mJobs = parseJobsDetails(jsonData);
} else {
AlertUserAboutError();
}
} catch (IOException e) {
Log.v(TAG, "Exception caught: ", e);
} catch (JSONException e) {
Log.v(TAG, "Exception caught: ", e);
}
}
});
}else {
AlertUserAboutError();
}
}
private Jobs parseJobsDetails (String jsonData) throws JSONException{
Jobs jobs = new Jobs();
jobs.setJobDetailses(getCurrentJobDetails(jsonData));
return jobs;
}
private JobDetails[] getCurrentJobDetails(String jsonData) throws JSONException {
JSONObject jsonObject = new JSONObject(jsonData);
JSONArray result = jsonObject.getJSONArray("result");
JobDetails[] jobDetails = new JobDetails[result.length()];
for (int i = 0; i < result.length(); i++) {
JSONObject jsonDetail = result.getJSONObject(i);
JobDetails jobDetail = new JobDetails();
jobDetail.setIds(jsonDetail.getString("id"));
jobDetail.setSalary(jsonDetail.getString("title"));
jobDetail.setTitles(jsonDetail.getString("salary"));
jobDetails[i] = jobDetail;
Log.d(TAG, jobDetail.getIds());
}
return jobDetails;
}
private boolean isNetworkAvailable() {
ConnectivityManager manger = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manger.getActiveNetworkInfo();
boolean isAvailable = false;
if(networkInfo != null && networkInfo.isConnected()){
isAvailable = true;
}
return isAvailable;
}
private void AlertUserAboutError() {
AlertDialogFragment dialog = new AlertDialogFragment();
dialog.show(getFragmentManager(),"error_dailog");
}
}
JobAdaptor class:
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.efe.efeAlumni.Model.JobDetails;
import com.efe.efeAlumni.R;
public class JobAdaptor extends BaseAdapter {
private JobDetails[] mJobs;
private Context mContext;
public JobAdaptor(Context context, JobDetails[] jobs) {
mContext = context;
mJobs = jobs;
}
#Override
public int getCount() {
return mJobs.length;
}
#Override
public Object getItem(int i) {
return mJobs[i];
}
#Override
public long getItemId(int i) {
return 0;
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.job_list_items, null);
holder = new ViewHolder();
holder.titleLabel = (TextView) convertView.findViewById(R.id.titleTextView);
holder.salaryLabel = (TextView) convertView.findViewById(R.id.salaryTextView);
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
JobDetails job = mJobs[position];
holder.titleLabel.setText(job.getTitles() + "");
holder.salaryLabel.setText(job.getSalary() + "");
if (position == 0) {
holder.titleLabel.setText("Noting to show ");
holder.titleLabel.setText(" ");
}
return convertView;
}
private static class ViewHolder {
TextView titleLabel;
TextView salaryLabel;
}
}
JobDetails class:
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.efe.efeAlumni.Model.JobDetails;
import com.efe.efeAlumni.R;
public class JobAdaptor extends BaseAdapter {
private JobDetails[] mJobs;
private Context mContext;
public JobAdaptor(Context context, JobDetails[] jobs) {
mContext = context;
mJobs = jobs;
}
#Override
public int getCount() {
return mJobs.length;
}
#Override
public Object getItem(int i) {
return mJobs[i];
}
#Override
public long getItemId(int i) {
return 0;
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
// brand new
convertView = LayoutInflater.from(mContext).inflate(R.layout.job_list_items, null);
holder = new ViewHolder();
holder.titleLabel = (TextView) convertView.findViewById(R.id.titleTextView);
holder.salaryLabel = (TextView) convertView.findViewById(R.id.salaryTextView);
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
JobDetails job = mJobs[position];
holder.titleLabel.setText(job.getTitles() + "");
holder.salaryLabel.setText(job.getSalary() + "");
if (position == 0) {
holder.titleLabel.setText("Noting to show ");
holder.titleLabel.setText(" ");
}
return convertView;
}
private static class ViewHolder {
TextView titleLabel;
TextView salaryLabel;
}
}

cannot create a custom list using hasmap

package com.thesoft.smsdemo;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.R.integer;
import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.thesoft.smsdemo.JSONParser;
public class Upload extends ActionBarActivity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_upload);
new Hi().execute();
}
private class Hi extends AsyncTask<String, Void, String> {
ProgressDialog rDialog;
JSONParser lv = new JSONParser();
ListView vti ;
public HashMap<Integer, HashMap<String, String>> notes_data = new HashMap<Integer, HashMap<String, String>>();
#Override
protected void onPreExecute() {
super.onPreExecute();
rDialog = new ProgressDialog(Upload.this);
rDialog.setMessage("Fetching Data From Server..");
rDialog.setIndeterminate(false);
rDialog.setCancelable(false);
rDialog.show();
}
#Override
protected String doInBackground(String... sam) {
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("co_name", "All"));
return lv.makeHttpRequest(
"+++++URL Link++++++++",
"GET", params);
}
#Override
protected void onPostExecute(String result) {
Log.d("value", result);
String name = "", head = "", desb = "", date = "";
JSONArray jsArray;
try {
jsArray = new JSONArray(result);
Log.d("json arry", "" + jsArray.length());
for (int j = 0; j < jsArray.length(); j++) {
HashMap<String, String> data = new HashMap<String, String>();
JSONObject jobj = jsArray.getJSONObject(j);
data.put("co_name", jobj.getString("co_name").toString());
data.put("head", jobj.getString("head").toString());
data.put("desb", jobj.getString("desb").toString());
data.put("date", jobj.getString("date").toString());
Log.d("valuesss",j+"");
notes_data.put(j, data);
Log.d("name",jobj.getString("co_name").toString());
Log.d("name",jobj.getString("head").toString());
Log.d("name",jobj.getString("date").toString());
}
/*String[] notes_da = {"hjhkh","hggg","hghgghgh"};
for (int i = 0; i < notes_da.length; i++) {
notes_da[i] = "Notes " + i;
}*/
MySimpleArrayAdapter mr = new MySimpleArrayAdapter(getApplicationContext(), notes_data);
/* ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(),R.layout.custom_list, R.id.tv, notes_da);
*/ vti=(ListView)findViewById(R.id.li1);
vti.setAdapter(mr);
} catch (JSONException e) {
e.printStackTrace();
} finally {
rDialog.dismiss();
Log.d("valuesss",notes_data.get(3).get("head"));
}
}
}
public class MySimpleArrayAdapter extends ArrayAdapter<String> {
private final Context context;
HashMap<Integer, HashMap<String, String>> data = new HashMap<Integer, HashMap<String, String>>();
public MySimpleArrayAdapter(Context context, HashMap<Integer, HashMap<String, String>> data) {
super(context, R.layout.custom_list);
this.context = context;
this.data = data;
}
#SuppressLint("ViewHolder")
#Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater
.inflate(R.layout.custom_list, parent);
TextView textView = (TextView) convertView.findViewById(R.id.tv);
TextView des = (TextView) convertView.findViewById(R.id.t2);
TextView date = (TextView) convertView.findViewById(R.id.textView1);
// change the icon for Windows and iPhone
String head = data.get(position).get("head");
String desb = data.get(position).get("desb");
String date1 = data.get(position).get("date");
textView.setText(head);
des.setText(desb);
date.setText(date1);
return convertView;
}
}
}
The data is fetched but not able to set it on custom Adapter for Listview
the data can be seen in log cat but the list activity is not shown on the device. Please Help me with this code Thanks
The data is fetched but not able to set it on custom Adapter for Listview
the data can be seen in log cat but the list activity is not shown on the device. Please Help me with this code Thanks
There are a couple of things you are missing:
Inside getView(...)
convertView = inflater.inflate(R.layout.custom_list, parent);
It should be inflater.inflate(R.layout.custom_list, null);
#param root Optional view to be the parent of the generated hierarchy.
public View inflate(int resource, ViewGroup root)
You have to override getCount in your custom adapter
#Override
public int getCount() {
return data.size();
}
where data = new HashMap>();
Additionally, its better to reuse cells in getView of your custom adapter. For this purpose you could use ViewHolder.
If not helpful, please share your layout xmls.

Categories

Resources