2014-03-05 103 views
0

我正在创建一个应用程序,并且我有一个名为SearchActivity的活动。我有两个自定义ListView,一个很好。我的问题是与AdapterEventos一起使用的列表。当我启动应用程序时,此列表中不会显示任何内容该列表中的数据是从Post(DescarregarEventos方法)中添加的,我认为问题是因为ArrayAdapter eventos为空。如果您看到我的代码[1],则在此列表的setAdapter之前打印的日志将返回空白。有人知道我能如何解决这个问题吗? 我已经看到POST返回请求的所有数据。ListView数据不显示在android sdk上

[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(); 
    } 

} 

} 

} 

回答

0

在每次添加项目EVENTOS时间首先创建AdapterEventos的情况下,

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

现在你必须没有确定新数据已到达的适配器。

eventos.add(new Evento(evento.getString("nome"),evento.getString("localizacao"),evento.getString("data_inicio"))); 
adapterEventos.notifyDataSetChanged(); 
+0

谢谢。现在,我收到一个错误'您必须提供TextView的资源ID'和'ArrayAdapter需要资源ID为文本视图' – pdcc

+0

由于您拥有自己的列表自定义布局,因此您可以扩展BaseAdapter而不是ArrayAdapter ,这将使您能够定制从适配器返回的视图 –