我很难搞清楚造成问题的原因。
所以,我试图从JSON中获取两组字符串并在列表视图中显示它们。当我第一次测试应用程序时,它很棒。一切都按预期工作。
但当我关闭并重新打开它时,我的列表视图只显示一组字符串(只有第二组,重复两次)。
这是处理解析JSON的类:(它在AsyncTask中执行)
public class ListarPosts extends SherlockActivity{
String URL = null, Titulo = null;
ArrayList<Post> posts = new ArrayList<Post>();
public ArrayList<Post> getPosts(String Json){
try {
JSONObject jObject = new JSONObject(Json);
JSONArray jArray = jObject.getJSONArray("Posts");
for (int i = 0; i < jArray.length(); i++) {
final int id = jArray.getJSONObject(i).getInt("ID");
final int tipo = verificaTipo(jArray.getJSONObject(i).getString("Tipo"));
final JSONArray jValues = jArray.getJSONObject(i).getJSONArray("Valores");
for (int a = 0; a < jValues.length(); a++) {
final String KEY = jValues.getJSONObject(a).getString("Key");
System.out.println(KEY);
final String Value = jValues.getJSONObject(a).getString("Value");
System.out.println(Value);
if (KEY.equals("URL"))
URL = Value;
else if (KEY.equals("TITULO"))
Titulo = Value;
}
ListarPosts.this.runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
posts.add(new Post(id, Titulo, tipo));
}
});
}
return posts;
} catch (ParseException e) {
e.printStackTrace();
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
当我打印键和值时,即使列表视图错误,它也会显示正确的字符串。
我的猜测是,当我创建新的“Post”并将其添加到ArrayList时出现问题。这可以解释为什么它打印正确的,但在ListView之后不会显示它。也许有些冲突因为我在AsyncTask中创建了一个新实例?
无论如何,我有点失落。如果您对我应该尝试或可能出现的问题有所了解,请告诉我。
感谢您提供任何帮助!
答案 0 :(得分:0)
每次Arraylist添加到新数据之前都要清除.... 并删除Asynctask.thats中的runonuithread,这里不需要..
public ArrayList<Post> getPosts(String Json){
try {
JSONObject jObject = new JSONObject(Json);
JSONArray jArray = jObject.getJSONArray("Posts");
if(posts.size()>0){
posts.clear();
}
for (int i = 0; i < jArray.length(); i++) {
final int id = jArray.getJSONObject(i).getInt("ID");
final int tipo = verificaTipo(jArray.getJSONObject(i).getString("Tipo"));
final JSONArray jValues = jArray.getJSONObject(i).getJSONArray("Valores");
for (int a = 0; a < jValues.length(); a++) {
final String KEY = jValues.getJSONObject(a).getString("Key");
System.out.println(KEY);
final String Value = jValues.getJSONObject(a).getString("Value");
System.out.println(Value);
if (KEY.equals("URL"))
URL = Value;
else if (KEY.equals("TITULO"))
Titulo = Value;
}
posts.add(new Post(id, Titulo, tipo));
}
return posts;
} catch (ParseException e) {
e.printStackTrace();
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}
多数民众赞成......
答案 1 :(得分:0)
问题出在runOnUiThread()中。 Tipo的值在我认为的线程中更新。
public class ListarPosts extends Activity {
ArrayList<String> URL = null, Titulo = null;
ArrayList<Post> posts = new ArrayList<Post>();
int id;
int tipo;
public ArrayList<Post> getPosts(String Json) {
try {
posts = new ArrayList<Post>();
URL = new ArrayList<String>();
Titulo = new ArrayList<String>();
JSONObject jObject = new JSONObject(Json);
JSONArray jArray = jObject.getJSONArray("Posts");
for (int i = 0; i < jArray.length(); i++) {
id = jArray.getJSONObject(i).getInt("ID");
tipo = 1;
final JSONArray jValues = jArray.getJSONObject(i).getJSONArray(
"Valores");
for (int a = 0; a < jValues.length(); a++) {
final String KEY = jValues.getJSONObject(a)
.getString("Key");
System.out.println(KEY);
final String Value = jValues.getJSONObject(a).getString(
"Value");
System.out.println(Value);
if (KEY.equals("URL"))
URL.add(Value);
else if (KEY.equals("TITULO"))
Titulo.add(Value);
}
}
for (String value : Titulo) {
// If you need to use runOnUiThread, you can implement here
posts.add(new Post(id, value, tipo));
}
return posts;
} catch (ParseException e) {
e.printStackTrace();
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}