Данные ListView не отображаются на Android SDK

Я делаю приложение, и у меня есть активность под названием SearchActivity. У меня есть два пользовательских ListView, и один работает хорошо. Моя проблема заключается в списке, используемом с AdapterEventos. Когда я запускаю приложение, в этом списке ничего не появляется. Данные из этого списка добавляются из сообщения (метод DescarregarEventos), и я думаю, что проблема в том, что событие ArrayAdapter пусто. Если вы видите мой код [1], журнал, который я печатаю перед setAdapter этого списка, возвращается пустым. Кто-нибудь знает, как я могу это исправить? Я уже вижу, что POST возвращает все запрошенные данные.

[1] http://pastebin.com/FZacCrHD

Спасибо

СООТВЕТСТВУЮЩИЙ КОД:

public class SearchActivity extends ListActivity {


public ArrayList<Evento> eventos = new ArrayList<Evento>();
static final String TAG = "AsyncTaskParseJson.java";
static final HttpClient httpclient = new DefaultHttpClient();

public class Evento {
    public String nome;
    public String local;
    public String inicio;

    public Evento(String nome, String local, String inicio) {
        this.nome = nome;
        this.local = local;
        this.inicio = inicio;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getLocal() {
        return local;
    }

    public void setLocal(String local) {
        this.local = local;
    }

    public String getInicio() {
        return inicio;
    }

    public void setInicio(String inicio) {
        this.inicio = inicio;
    }

    }


public class AdapterEventos extends ArrayAdapter<Evento> {

    private final Context context;
    private final ArrayList<Evento> eventosArrayList;

    public AdapterEventos(Context context, ArrayList<Evento> eventos) {

        super(context, R.layout.listeventos, eventos);

        this.context = context;
        this.eventosArrayList = eventos;
    }

    public View getViewEventos(int position, View convertView, ViewGroup parent) {

        //Create inflater
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        //Get rowView from inflater
        View LinhaEventoView = inflater.inflate(R.layout.listeventos, parent, false);

        //Get the text view from the rowView
        TextView nomeView = (TextView) LinhaEventoView.findViewById(R.id.tvNomeEvento);
        TextView localView = (TextView) LinhaEventoView.findViewById(R.id.tvLocalEvento);
        TextView inicioView = (TextView) LinhaEventoView.findViewById(R.id.tvInicioEvento);

        //Set the text for textView
        nomeView.setText(eventosArrayList.get(position).getNome());
        localView.setText(eventosArrayList.get(position).getLocal());
        inicioView.setText(eventosArrayList.get(position).getInicio());

        //return rowView
        return LinhaEventoView;
    }
}
@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.search_activity);

         new DescarregarEventos().execute();

ListView ListEventos=(ListView)findViewById(R.id.listEventos);
Log.d("eventos","eventos: " + eventos);
ListEventos.setAdapter(new AdapterEventos(this, eventos));


public class DescarregarEventos extends AsyncTask<String, String, String> {


JSONArray dataJsonArr = null;

protected String doInBackground(String... arg) {


    HttpPost httppost = new HttpPost(eventosUrl);
    String evt = null;

try {

    //Criar parâmetros para o Post.
    List<NameValuePair> params = new ArrayList<NameValuePair>();    
    params.add(new BasicNameValuePair("eventos", "data"));

    httppost.setEntity(new UrlEncodedFormEntity(params));

    //Executar o Post.
    ResponseHandler<String> responseHandler = new BasicResponseHandler();
    evt = httpclient.execute(httppost, responseHandler);

} catch (UnsupportedEncodingException e) {          

    Log.d("HTTP","ERRO A ADICIONAR OS PARÂMETROS PARA O POST EM \"DescarregarEventos()\"");
    e.printStackTrace();

} catch (IOException e) {

    Log.d("HTTP", "ERRO EM \"DescarregarEventos()\"");
    e.printStackTrace();
}

return evt;

}

// Tratar a resposta do Post e adicionar ao array respetivo.
public void onPostExecute(String evt) {
    try {
        JSONArray E = new JSONArray(evt);
        for (int i = 0; i < E.length(); i++) {
            JSONObject evento = E.getJSONObject(i);
            eventos.add(new Evento(evento.getString("nome"),evento.getString("localizacao"),evento.getString("data_inicio")));
        }

    } catch (JSONException e) {
        Log.d("HTTP","ERRO A TRATAR OS EVENTOS EM \"DescarregarEventos() \" - \"onPostExecute()\"");
        e.printStackTrace();
    }

}

}

}

person pdcc    schedule 05.03.2014    source источник


Ответы (1)


сначала создайте экземпляр AdapterEventos,

AdapterEventos adapterEventos = new AdapterEventos(this, eventos);
ListEventos.setAdapter(adapterEventos );

теперь каждый раз, когда вы добавляете элемент в events, вы должны уведомлять адаптер о поступлении новых данных.

eventos.add(new Evento(evento.getString("nome"),evento.getString("localizacao"),evento.getString("data_inicio")));
adapterEventos.notifyDataSetChanged();
person moh.sukhni    schedule 05.03.2014
comment
Спасибо. Теперь я получаю сообщение об ошибке «Вы должны указать идентификатор ресурса для TextView» и «ArrayAdapter требует, чтобы идентификатор ресурса был текстовым представлением» - person pdcc; 05.03.2014
comment
Поскольку у вас есть свой собственный макет для списка, вы можете расширить BaseAdapter вместо ArrayAdapter‹Evento›, это даст возможность настроить возвращаемое представление из адаптера. - person moh.sukhni; 06.03.2014