我有一个关于ListView的问题:它应该显示5行,但它只检索一行。
ListView已在活动的onCreate方法(doveDormire = (ListView)findViewById(R.id.listadovedormire)
)中声明。
这是我为listview设置适配器的方法:
public void caricaListView() {
url="***";
final ArrayAdapter<TutteRicettiveClasse> adapter = new TutteRicettiveVicineAdapterWithImage(
this);
Myonclicklistneer myclickListener = new Myonclicklistneer();
doveDormire.setAdapter(adapter);
new DownloadTutteRicettiveVicineAsyncTask(adapter, url, this).execute();
doveDormire.setOnItemClickListener(myclickListener);
}
TutteRicettiveClasse:
public class TutteRicettiveClasse extends StrutturaClasse{
}
StrutturaClasse:
public class StrutturaClasse {
private String nome;
private String immagine;
private String indirizzo;
private String numerocivico;
private String comune;
private String cap;
private String latitudine;
private String longitudine;
private Double distanza;
private String ID;
private String ServiziOfferti;
private String Feature;
public Double getDistanza() {
return distanza;
}
public void setDistanza(Double distanza) {
this.distanza = distanza;
}
public String getLatitudine() {
return latitudine;
}
public void setLatitudine(String latitudine) {
this.latitudine = latitudine;
}
public String getLongitudine() {
return longitudine;
}
public void setLongitudine(String longtitudine) {
this.longitudine = longtitudine;
}
public String getComune() {
return comune;
}
public void setComune(String comune) {
this.comune = comune;
}
public String getCap() {
return cap;
}
public void setCap(String cap) {
this.cap = cap;
}
public String getNumerocivico() {
return numerocivico;
}
public void setNumerocivico(String numerocivico) {
this.numerocivico = numerocivico;
}
public String getIndirizzo() {
return indirizzo;
}
public void setIndirizzo(String indirizzo) {
this.indirizzo = indirizzo;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getImmagine() {
return immagine;
}
public void setImmagine(String immagine) {
this.immagine = immagine;
}
public String getID() {
return ID;
}
public void setID(String iD) {
ID = iD;
}
public String getServiziOfferti() {
return ServiziOfferti;
}
public void setServiziOfferti(String serviziOfferti) {
ServiziOfferti = serviziOfferti;
}
public String getFeature() {
return Feature;
}
public void setFeature(String feature) {
Feature = feature;
}
}
这是AsyncTask:
public final class DownloadTutteRicettiveVicineAsyncTask extends
AsyncTask<Void, TutteRicettiveClasse, Void> {
private final ArrayAdapter<TutteRicettiveClasse> adapter;
String url;
Context ctx;
private ProgressDialog progressDialog;
public DownloadTutteRicettiveVicineAsyncTask(
ArrayAdapter<TutteRicettiveClasse> adapter, String url, Context ctx) {
this.adapter = adapter;
this.url = url;
progressDialog = new ProgressDialog(ctx);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.setMessage(progressDialog.getContext().getString(
R.string.attendereprego));
progressDialog.setCancelable(true);
progressDialog.show();
}
@Override
protected Void doInBackground(Void... params) {
try {
JSONObject obj = getJSONObject(url);
JSONArray jsonArray = obj.getJSONArray("struttura");
latitudini = new ArrayList<String>();
longitudini = new ArrayList<String>();
nomi = new ArrayList<String>();
immagini = new ArrayList<String>();
indirizzi = new ArrayList<String>();
comuni = new ArrayList<String>();
idtipologia = new ArrayList<String>();
idstruttura = new ArrayList<String>();
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
TutteRicettiveClasse t = new TutteRicettiveClasse();
t.setNome(jsonObject.getString("Nome").replace(
"apostrofoandroid", "'"));
t.setIndirizzo(jsonObject.getString("Indirizzo"));
t.setNumerocivico(jsonObject.getString("NumeroCivico"));
t.setComune(jsonObject.getString("Comune"));
t.setCap(jsonObject.getString("CAP"));
t.setImmagine(jsonObject.getString("immagine"));
t.setLatitudine(jsonObject.getString("Latitudine"));
t.setLongitudine(jsonObject.getString("Longitudine"));
t.setDistanza(jsonObject.getDouble("distanza"));
t.setID(jsonObject.getString("ID"));
t.setFeature(jsonObject.getString("Feature"));
publishProgress(t);
}
} catch (IOException ignored) {
} catch (JSONException ignored) {
}
return null;
}
@Override
protected void onProgressUpdate(TutteRicettiveClasse... values) {
for (TutteRicettiveClasse a : values) {
adapter.add(a);
}
}
@Override
protected void onPostExecute(Void v) {
progressDialog.hide();
}
private static JSONObject getJSONObject(String url) throws IOException,
MalformedURLException, JSONException {
HttpURLConnection conn = (HttpURLConnection) new URL(url)
.openConnection();
InputStream in = conn.getInputStream();
try {
StringBuilder sb = new StringBuilder();
BufferedReader r = new BufferedReader(new InputStreamReader(
new DoneHandlerInputStream(in)));
for (String line = r.readLine(); line != null; line = r.readLine()) {
sb.append(line);
}
return new JSONObject(sb.toString());
} finally {
in.close();
}
}
}
最后是适配器:
import com.androidquery.AQuery;
import android.content.Context;
import android.graphics.Bitmap;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class TutteRicettiveVicineAdapterWithImage extends
ArrayAdapter<TutteRicettiveClasse> {
String Feature;
public TutteRicettiveVicineAdapterWithImage(Context context) {
super(context, R.layout.elementolistastrutture, R.id.nome);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
AQuery aq = new AQuery(getContext());
convertView = super.getView(position, convertView, parent);
TutteRicettiveClasse t = getItem(position);
TextView nome = (TextView) convertView.findViewById(R.id.nome);
String Nome = t.getNome();
nome.setText(Nome);
TextView indirizzo = (TextView) convertView
.findViewById(R.id.indirizzo);
String Indirizzo = t.getIndirizzo();
String Numerocivico = t.getNumerocivico();
if (Numerocivico.equals(" ")) {
indirizzo.setText(Indirizzo);
} else {
indirizzo.setText(Indirizzo + ", " + Numerocivico);
}
TextView CAP = (TextView) convertView.findViewById(R.id.cap);
String Cap = t.getCap();
CAP.setText(Cap);
TextView Comune = (TextView) convertView.findViewById(R.id.comune);
String COmune = t.getComune();
Comune.setText(COmune);
TextView Distanza = (TextView) convertView.findViewById(R.id.distanza);
Double DIstanza = t.getDistanza();
Distanza.setText(DIstanza + " km");
Feature = t.getFeature();
ImageView image = (ImageView) convertView.findViewById(R.id.image);
String url = t.getImmagine();
Bitmap preset = aq.getCachedImage(url);
Bitmap placeholder = aq.getCachedImage(R.drawable.cache);
if (preset == null) {
if (aq.shouldDelay(position, convertView, parent, url)) {
aq.id(image).image(placeholder, 0);
} else {
aq.id(image).image(url, true, true, 0, 0, placeholder,
AQuery.FADE_IN, 0);
}
} else {
image.setImageBitmap(preset);
}
return convertView;
}
}
在调试模式下,我注意到适配器不会改变位置的值:
TutteRicettiveClasse t = getItem(position);
位置始终为0.检索到的Json对象是一个包含5个元素的数组,所以我真的不明白为什么它不会改变...
也许这是一个上下文问题?我从一个从异步回调中调用的方法中为ListView设置了适配器。
如果可以,请帮助我:-)提前致谢!