Cómo obtener actualizaciones en vivo a través de JSON a listview

No pude encontrar una forma de obtener actualizaciones en vivo a través de JSON a una lista.

Mi actividad solicita datos JSON desde una página web y el código es:

public class Second extends Activity { static final String Li_nk = "LinkName:"; static final String Image_name = "ImageName:"; ListView list; public final static String AUTH = "authentication"; static final String KEY_THUMB_URL = "thumb_image"; // Uri.decode("http://zeesms.info/android_app_images/Koala.jpg"); @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.main); Intent i2 = getIntent(); String wrd = i2.getStringExtra("entrd"); Log.v("keyis", wrd); // if(wrd.equalsIgnoreCase("test")){ JSONObject j2 = JSONfunctions.getJSONfromURL("/webservice_search.php?keyword=" + wrd + "&format=json"); ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>(); try { JSONArray jray = j2.getJSONArray("listings"); for (int i = 0; i < jray.length(); i++) { Log.v("state", "json data being read"); JSONObject j3 = jray.getJSONObject(i); String first = j3.getString("listing"); Log.v("sublist", first); JSONObject j4 = j3.getJSONObject("listing"); String sec = j4.getString("links"); int maxLength = (sec.length() < 30) ? sec.length() : 27; sec.substring(0, maxLength); String cutsec = sec.substring(0, maxLength); Log.v("links are", cutsec); String img = j4.getString("image_name"); Log.v("image name is ", img); // Uri // dimg=Uri.parse("http://zeesms.info/android_app_images/Koala.jpg"); HashMap<String, String> map = new HashMap<String, String>(); map.put("Id", String.valueOf(i)); map.put(Li_nk, cutsec); map.put(Image_name, j4.getString("image_name")); map.put(KEY_THUMB_URL, "http://zeesms.info/android_app_images/" + img); mylist.add(map); } } catch (JSONException e) { alertbox(); Log.e("loG_tag", "Error parsing" + e.toString()); } list = (ListView) findViewById(R.id.lv1); this.list.setEmptyView(findViewById(R.id.empty)); list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // Toast.makeText(getApplicationContext(),"Click ListItem Number " // + position, Toast.LENGTH_LONG).show(); Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.riffre.com/")); startActivity(myIntent); } }); LazyAdapter adapter = new LazyAdapter(this, mylist); list.setAdapter(adapter); list.setItemsCanFocus(false); // } /* * else{ alertbox(); } */ } /* * public void register(View view) { Log.w("C2DM", * "start registration process"); Intent intent = new * Intent("com.google.android.c2dm.intent.REGISTER"); * intent.putExtra("app", PendingIntent.getBroadcast(this, 0, new * Intent(), 0)); // Sender currently not used intent.putExtra("sender", * "nonsenses@gmail.com"); startService(intent); } * * public void showRegistrationId(View view) { SharedPreferences prefs = * PreferenceManager .getDefaultSharedPreferences(this); String string = * prefs.getString(AUTH, "n/a"); Toast.makeText(this, string, * Toast.LENGTH_LONG).show(); Log.d("C2DM RegId", string); * * } */ public void alertbox() { new AlertDialog.Builder(this).setMessage("Invalid Keyword,No Results found").setTitle("Alert").setCancelable(true).setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { finish(); } }).show(); } } 

Y estoy usando un adaptador personalizado con el código de la siguiente manera:

 public class LazyAdapter extends BaseAdapter { private Activity activity; private ArrayList<HashMap<String, String>> data; private static LayoutInflater inflater=null; public ImageLoader imageLoader; public LazyAdapter(Activity a, ArrayList<HashMap<String, String>> d) { activity = a; data=d; inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); imageLoader=new ImageLoader(activity.getApplicationContext()); } @Override public int getCount() { // TODO Auto-generated method stub return data.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View vi=convertView; if(convertView==null) vi = inflater.inflate(R.layout.custom_row_view1, null); TextView title = (TextView)vi.findViewById(R.id.linkname); // merchnts name TextView artist = (TextView)vi.findViewById(R.id.imagename); // address //TextView duration = (TextView)vi.findViewById(R.id); // distance ImageView thumb_image=(ImageView)vi.findViewById(R.id.mClogo); // logo HashMap<String, String> jsn = new HashMap<String, String>(); jsn = data.get(position); // Setting all values in listview title.setText(jsn.get(Second.Li_nk)); artist.setText(jsn.get(Second.Image_name)); //duration.setText(song.get(CustomizedListView.KEY_DURATION)); imageLoader.DisplayImage(jsn.get(Second.KEY_THUMB_URL), thumb_image); return vi; } } 

Lo que quiero es que la aplicación actualice el listview con los datos cada minuto o así. También la última entrada en la lista debe permanecer en la parte superior.

Cuál sería la mejor forma de hacer esto?

Ponga su código de análisis de JSON, que es probablemente su bloque try..catch en una función separada y no en onCreate() .

Así que fácilmente puede llamar a esa parte cada minuto. Digamos que el nombre de la función LoadData() también agregue una línea más adapter.notifyDataSetChanged() para actualizar el adaptador / lista cada vez.

Ahora en su onCreate (), escriba este código para llamar a esa función cada minuto,

  final Handler handler = new Handler(); Runnable runable = new Runnable() { @Override public void run() { //call the function LoadData(); //also call the same runnable handler.postDelayed(this, 1000); } }; handler.postDelayed(runable, 1000); 

Ahora para el segundo problema, para agregar nuevos datos en la parte superior.

Sólo estoy recibiendo una cosa en mente ahora mismo para escribir un bucle, AÑADIR ESTO EN SU FUNCIÓN ANTES DE LLAMAR ADAPTADOR NOTIFICAR CAMBIO, como

  ArrayList<HashMap<String,String>> mylist = new ArrayList<HashMap<String,String>>(); ArrayList<HashMap<String,String>> mylistTemp = new ArrayList<HashMap<String,String>>(); for(int i = mylist.size()-1 ; i >=0;i--) { mylistTemp.add(mylist.get(i)); } mylist = mylistTemp; 

Bueno, si el código de arriba está funcionando, debe ser capaz de lograr su objetivo con los siguientes pasos:

  • Extraiga su código JSON-Loading en un AsyncTask, que puede activar cada minuto. ( AsyncTask )
  • Actualice su ListAdapter utilizando AsyncTask.

Esta es una posible implementación del método onCreate (), que ejecutará una tarea de actualización cada minuto:

 public class JSON_AndroidActivity extends Activity { /** Called when the activity is first created. */ private JSONLoaderTask mJSONLoaderTask; private Handler mHandler; private ArrayAdapter<String> mArrayAdapter; private Runnable mRefresher = new Runnable() { @Override public void run() { mJSONLoaderTask = new JSONLoaderTask(JSON_AndroidActivity.this, mArrayAdapter); mJSONLoaderTask.execute(""); mHandler.postDelayed(this, 1000); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mHandler.postDelayed(mRefresher, 1000); } } 

Y aquí está una implementación del casco de una posible tarea, donde usted puede hacer su carga pesada y actualizar su adaptador para la lista:

 public class JSONLoaderTask extends AsyncTask<String, String, String> { private Context context; private ProgressDialog progressDialog; private final ArrayAdapter<String> mArrayAdapter; public JSONLoaderTask(Context pContext, ArrayAdapter<String> pArrayAdapter) { this.context = pContext; this.mArrayAdapter = pArrayAdapter; } @Override protected void onPreExecute() { progressDialog = new ProgressDialog(context); progressDialog.show(); } @Override protected String doInBackground(String... params) { String result = getJSONStream(); return result; } private String getJSONStream() { //load your string here return ""; } @Override protected void onPostExecute(String result) { progressDialog.dismiss(); // Update your ArrayAdapter } } 
  • Ksoap2 Android - ¿cómo especificar un espacio de nombres para las propiedades secundarias de un objeto complejo?
  • Cómo rellenar el diseño de la tabla con la cadena JSON
  • Retrofit 2: enviar archivos con el objeto json
  • ¿Pasar datos a los servicios web .net y obtener resultados?
  • Error de java.lang.outofmemory (servicios web) en android
  • Cómo enviar una cadena json a un servicio .NET REST de java?
  • Cliente Android para servicio web REST con seguridad básica
  • Poner byte en JSON en android
  • Aplicación de Android CursorWindow error de memoria
  • APP de Android que consume un servicio web cómo autenticar usuarios
  • Utilizar el cursor para consultar desde el motor de aplicaciones de Google en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.