update studio refrescar elementos dinamico agregar android android-layout android-asynctask

refrescar - reload listview android studio



Android: tiene problemas para actualizar un ListAdapter después de una llamada Asynch (2)

Estoy configurando un adaptador ListView como este:

public class SeeAllQuestionsActivity extends Activity { //ArrayAdapter<Question> adapter; SimpleAdapter mSchedule = null; ListView list = new ListView (this); TextView loading_questions = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.all_question_page); TextView loading_questions = (TextView) findViewById(R.id.loading_questions); list = (ListView) findViewById(R.id.list); ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>(); HashMap<String, String> map = new HashMap<String, String>(); mSchedule = new SimpleAdapter(this, mylist, R.layout.questions_list, new String[] {"train", "from", "to"}, new int[] {R.id.TRAIN_CELL, R.id.FROM_CELL, R.id.TO_CELL}); list.setAdapter(mSchedule); list.setTextFilterEnabled(true); list.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { ...

y luego hacer una llamada Asynch remota para obtener la lista de mi base de datos, y tratar de hacer esto en el método onPostExecute:

ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>(); HashMap<String, String> map = new HashMap<String, String>(); try { JSONArray obj = new JSONArray(result); if ( obj != null ) { for ( int i = 0; i < obj.length(); i++ ) { JSONObject o = obj.getJSONObject(i); map.put("train", "Business Name"); map.put("from", ">"); map.put("to", ">"); mylist.add(map); map = new HashMap<String, String>(); map.put("train", "103(x)"); map.put("from", "6:35 AM"); map.put("to", "7:45 AM"); mylist.add(map); } } } catch ( Exception e ) { } list.setAdapter(mSchedule);

pero obtengo una excepción de puntero nulo en esta línea:

ListView list = new ListView (this);

Pero, en general, creo que estoy muy lejos de la forma en que esto debe hacerse en el método postExecute. Cualquier ayuda con cómo hacer esto correctamente es muy apreciada.


Como recuerdo y como conclusión lógica: en el momento de su llamada, la referencia de esto es nula . se accederá a esto en el constructor de su ListView, por lo que se generará una NullPointerException . Si desea crearlo dinámicamente, debe llamar al constructor ListView dentro del método onCreate de su Actividad .

Al menos es mejor implementarlo como lo sugiere MartijnVanMierloo, si es posible.


En su OnCreate , define un nuevo SimpleAdapter y lo asocia a su ListView. Esto es correcto. El origen de datos ( mylist en su caso) está vacío en este momento, así que lo completará en AsyncTask .

En su onPostExecute está creando una nueva ArrayList . Dependiendo del resultado que reciba, lo completa. Después de hacer esto, está configurando el adaptador nuevamente. Lo cual no hará nada porque el adaptador no tiene datos. Lo que quiere hacer es entregar su nueva lista completa a su Adaptador para que pueda llenar el ListView con sus datos.

Solución 1

onPostExecute { // create a list to store your data new ArrayList // fill the new list with the data you received (result) fillArrayList from JSON // create an adapter and give the new list with it mAdapter = new SimpleAdapter(.., ArrayList, ...) listView.setAdapter(mAdapter); }

Esta es una forma en que puede hacerlo y se adapta a su implementación actual.

Solución 2

Yo optaría por esta solución

onPostExecute { // don''t create a new arraylist but use the mylist-object you created in the OnCreate fill mylist object with new data // mylist is the datasource of your adapter and it is now changed. // let the ListView know his adapter received new information mSchedule.notifyDataSetChanged }

ACTUALIZAR

Mira este tutorial . Uso los mismos diseños y la misma fuente para completar mi lista, pero la he modificado para que sea similar a su caso. Buena suerte :)

Actividad principal

public class MainActivity extends Activity { private List<HashMap<String, String>> fillMaps; private SimpleAdapter adapter; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView lv = (ListView) findViewById(R.id.listview); String[] from = new String[] { "rowid", "col_1", "col_2", "col_3" }; int[] to = new int[] { R.id.item1, R.id.item2, R.id.item3, R.id.item4 }; // My data fillMaps = new ArrayList<HashMap<String, String>>(); // Create an adapter which will tell my ListView what to show.. // fillMaps is still empty so at the moment it my ListView will show // nothing. adapter = new SimpleAdapter(this, fillMaps, R.layout.row, from, to); lv.setAdapter(adapter); // Retreive data from somewhere new UpdateListWithAsyncTask().execute(); } private class UpdateListWithAsyncTask extends AsyncTask<Void, Void, Void> { protected Void doInBackground(Void... params) { // do stuff return null; } protected void onPostExecute(Void result) { // Fill your datasource that your adapter has. In my case fillMaps for (int i = 0; i < 10; i++) { HashMap<String, String> map = new HashMap<String, String>(); map.put("rowid", "" + i); map.put("col_1", "col_1_item_" + i); map.put("col_2", "col_2_item_" + i); map.put("col_3", "col_3_item_" + i); fillMaps.add(map); } // my datasource is now changed, I want my adapter to know this and // update my ListView adapter.notifyDataSetChanged(); } } }