2016-02-04 1 views
-1

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

+0

listArrayList semble ne pas être initialisé. dans oncreate ajouter 'listArrayList = new ArrayList <>();' – Raghunandan

Répondre

0

Définir

ListAdapter adapter; 

au niveau de la classe, puis changer

private ArrayList<HashMap<String, String>> listArrayList; 

à

private ArrayList<HashMap<String, String>> listArrayList = new ArrayList<HashMap<String, String>>(); 

Une fois que les données sont disponibles à partir appel de réponse adapter.notifyDataSetChanged() en onResponse() .

+0

Merci mon pote, désolé n'a pas pu voir que parce que je suis pressé. Quoi qu'il en soit, je ne connais pas très bien la volée, pouvez-vous me donner quelques conseils sur ce que je devrais mettre ceci et cela. merci beaucoup j'ai mis pDialog.dismiss() après la demande de volée, est-ce correct? – Alvinrightback

+0

Je n'ai jamais utilisé Volley mais 'pDialog.dismiss()' devrait être la dernière instruction de la méthode 'onResponse'. – Rohit5k2