Je suis en train de remplir une liste avec des données de la base de données en utilisant Volley (pas vraiment familier).Listview ne fonctionne pas en utilisant volley
donc voici le code java
package com.example.wackyroad.internannouncement;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import com.android.volley.Request;
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.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends ListActivity {
private static final String GET_URL = "http://intern.alcfoundation.ph/mobile/get_announcement";
private JSONArray listArray = null;
private static final String TAG_ID = "id";
private static final String TAG_TITLE = "title";
private static final String TAG_CONTENT = "content";
private static final String TAG_DATE = "date";
private ArrayList<HashMap<String, String>> listArrayList;
private ProgressDialog pDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
updateList();
getAnnouncement();
pDialog.dismiss();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.refresh) {
return true;
}
return super.onOptionsItemSelected(item);
}
private void getAnnouncement() {
StringRequest postRequest = new StringRequest(Request.Method.POST, GET_URL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject jsonResponse = new JSONObject(response);
Log.d("JSONOBject", ""+jsonResponse);
try {
JSONArray data = jsonResponse.getJSONArray("announcements");
for (int i = 0; i < data.length(); i++) {
JSONObject c = data.getJSONObject(i);
HashMap<String, String> map = new HashMap<String, String>();
map.put(TAG_ID, c.getString("announcement_id"));
map.put(TAG_TITLE, c.getString("announcement_title"));
map.put(TAG_CONTENT, c.getString("announcement_content"));
map.put(TAG_DATE, c.getString("announcement_date"));
listArrayList.add(map);
Log.d("JSONArray", "" + map);
}
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
}
) {
};
pDialog = new ProgressDialog(MainActivity.this);
pDialog.setMessage("Getting Announcements..");
pDialog.show();
Volley.newRequestQueue(getApplication()).add(postRequest);
}
private void updateList() {
ListAdapter adapter = new SimpleAdapter(this, listArrayList,
R.layout.activity_lv_list, new String[]{TAG_ID, TAG_TITLE, TAG_CONTENT,
TAG_DATE}, new int[]{R.id.tv_id, R.id.tv_title, R.id.tv_content, R.id.tv_date});
setListAdapter(adapter);
ListView lv = getListView();
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent i = new Intent(getApplicationContext(), Announcement_Details.class);
String tv_id = ((TextView) view.findViewById(R.id.tv_id)).getText().toString();
i.putExtra("tv_id", tv_id);
startActivity(i);
}
});
}
}
Voici le logcat
02-04 08:36:51.975 1380-1380/com.example.wackyroad.internannouncement E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.wackyroad.internannouncement, PID: 1380
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.wackyroad.internannouncement/com.example.wackyroad.internannouncement.MainActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at android.widget.SimpleAdapter.getCount(SimpleAdapter.java:93)
at android.widget.ListView.setAdapter(ListView.java:480)
at android.app.ListActivity.setListAdapter(ListActivity.java:265)
at com.example.wackyroad.internannouncement.MainActivity.updateList(MainActivity.java:134)
Voici les données JSON de la base de données
{"success":1,"message":"Post Available!","announcements":[{"announcement_id":"1","announcement_title":"Sample Title Here","announcement_content":"Sample Content","announcement_date":"2016-02-04"},{"announcement_id":"2","announcement_title":"Sample Title","announcement_content":"Sample Content Again","announcement_date":"2016-02-04"}]}
I Tried afficher les valeurs de JSONObject et jsonarray dans le Logcat et c'est là. donc je pense que le problème est dans la population de données dans la liste. J'espère que quelqu'un peut me aider
listArrayList semble ne pas être initialisé. dans oncreate ajouter 'listArrayList = new ArrayList <>();' – Raghunandan