【发布时间】:2015-03-14 15:15:02
【问题描述】:
我正在尝试使用 AsyncTask 将我的代码优化到我的适配器中,以执行 Internet 请求以读取 JSON 并显示其数据。 我在使用 AsyncTask 更改之前的代码运行良好,所以我现在做错了,因为它在请求过期后没有设置文本。我希望在滚动列表视图时,AsyncTask 运行互联网连接的代码,完成后,它将文本从默认更改为文本视图。
适配器类
public class ListBookmarksAdapter extends ArrayAdapter<BookmarksHandler>{
private final Context context;
private List<BookmarksHandler> list;
DatabaseHandler dh;
SQLiteDatabase db;
ViewHolder viewHolder;
Gson gson;
public ListBookmarksAdapter(Context context, List<BookmarksHandler> list) {
super(context, R.layout.listbookmarks, list);
this.context = context;
this.list = list;
}
static class ViewHolder{
TextView tvTitle;
TextView tvChapter;
ImageView immagine;
}
@Override
public View getView(final int position, View rowView, ViewGroup parent) {
gson = new Gson();
dh = new DatabaseHandler(context);
db = dh.getWritableDatabase();
if(rowView==null){
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
rowView = inflater.inflate(R.layout.listbookmarks, parent, false);
viewHolder = new ViewHolder();
viewHolder.tvTitle = (TextView) rowView.findViewById(R.id.tvTitle);
viewHolder.tvChapter = (TextView) rowView.findViewById(R.id.tvChapter);
viewHolder.immagine = (ImageView) rowView.findViewById(R.id.imageView);
rowView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) rowView.getTag();
}
new AsyncList(position).execute("http://www.myurl.com/" +list.get(position).getId_manga() + "/");
return rowView;
}
private class AsyncList extends AsyncTask<String, Void, String> {
int position;
public AsyncList(int position){
this.position = position;
}
@Override
protected String doInBackground(String... params) {
String urlManga = null;
try {
urlManga = MainActivity.connessione(params[0]);
} catch (Exception e) {
e.printStackTrace();
}
assert urlManga != null;
return urlManga.trim();
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
MangaSpec manga = gson.fromJson(result, MangaSpec.class);
viewHolder.tvTitle.setText(manga.getTitle());
viewHolder.tvTitle.setSelected(true);
if(Integer.parseInt(String.valueOf(manga.getStatus()))==2)
viewHolder.immagine.setImageResource(R.drawable.book_close);
List generic = manga.getChapters();
for(int i=0; i<generic.size(); i++){
List chapters = (List) generic.get(i);
if(((String) chapters.get(3)).equals(list.get(position).getId_chapter())){
double numero = (Double) chapters.get(0);
String titoloC = (String) chapters.get(2);
if((numero-(int)numero)!=0)
viewHolder.tvChapter.setText(numero+" - "+titoloC);
else
viewHolder.tvChapter.setText((int)numero+" - "+titoloC);
viewHolder.tvChapter.setSelected(true);
}
}
}
}
}
这里是 MainActivity.connessione 方法:
public static String connessione(String url) throws Exception {
URL website = new URL(url);
URLConnection connection = website.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuilder response = new StringBuilder();
String inputLine;
while ((inputLine = in.readLine()) != null)
response.append(inputLine);
in.close();
return response.toString();
}
这是我的意思的屏幕:
“Shingeki no Kyoijin”和“63 - Catene”是第一排的项目(按照箭头)。列表中的其他两项具有不同的值。如您所见,前两项的文本设置为默认值(文本),最后一项设置错误。
【问题讨论】:
-
是的,但是具体出了什么问题
-
当请求过期并创建适配器时,必须在 AsyncTask postExecute 中设置的文本未设置!
-
为了让 323go 看到你的评论,你必须在评论中用
@323go标记他,就像我在这里标记你一样 -
这里有几个问题:不要在getview中调用
new Gson和new DatabaseHandler。这称为每次您创建一个新的列表视图项(向上和向下滚动)。 -
@JaredBurrows 谢谢,现在优化
标签: android asynchronous android-asynctask adapter