我对自定义列表视图中的async http调用有疑问。如何在我的以下自定义Listview中调用异步调用并解析json以填充Listview。我的自定义列表视图包含图像和文本。
import java.util.ArrayList;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.ListActivity;
import android.os.Bundle;
import android.os.StrictMode;
import android.view.Menu;
import android.view.View;
import android.widget.ListView;
public class ListActivityS extends ListActivity
{
private GetHttpCall getCall;
String item[];
int id[];
ArrayList<Video> videos;
@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
super.onCreate(savedInstanceState);
//Crearte instance to http call
getCall=new GetHttpCall();
String response=null;
try {
response=getCall.connect();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
JSONParser _parser=new JSONParser();
_parser.parseHttpJson(response);
item = JSONParser.num_title;
id=JSONParser.num_id;
videos=new ArrayList<Video>();
for(int i=0;i<item.length;i++)
{
Video vid=new Video();
vid.setTitle(item[i]);
vid.setId(id[i]);
videos.add(vid);
}
getListView().setDividerHeight(2);
getListView().setAdapter(new BindDataAdapter(this, videos));
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Builder builder = new AlertDialog.Builder(this);
builder.setMessage(item[position] + " is clicked.");
builder.setPositiveButton("OK", null);
builder.show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_list, menu);
return true;
}
}
答案 0 :(得分:0)
你在创建时开始获取http请求,这很糟糕。请求应该在asynctask中的单独线程中执行。
如果你需要,我可以提供一些代码,但是到处都有很多很好的例子。
答案 1 :(得分:0)
引用this和this ..在该教程中,他们将使用AsyncTask获取JSON推文,解析它们,然后在ListView中显示它们。
正在使用AsyncTask在用户搜索查询上执行提取,解析和显示推文提要。
答案 2 :(得分:0)
您需要使用AsyncTask
下载您将显示的数据,然后通过更新列表适配器以及ListView
private GetStuff extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Param . . . params){
//Do all you i/o stuff like downloading content here
return null;
}
@Override
protected void onPostExecute(){
//update your list adapter here
}
}
如果您愿意,可以read more about AsyncTask here。使用它来更新列表视图的想法如下。
(1)执行doInBackground
内的所有I / O功能。这不是一个选择,因为它是Jellybean前进的要求。涉及i / o的任何事情都必须在后台。此外,在此处处理任何位图或其他内容也是一种好习惯,因为它可以避免阻止UI线程。获取您的内容并在此处理。
(2)更新onPostExecute中的ListView
。在AsyncTask
结构中onPostExecute
运行doInBackround
完成后在UI线程上包含的任何方法。由于必须从UI线程更新ListView
,因此用于更新适配器和通知数据集更改的方法必须在此处。
(3)创建一个新任务并在您的活动中执行它。如果您希望开始下载和更新过程,则需要添加以下内容
GetStuff get = new GetStuff();
get.execute();
这实际上会启动任务运行。
就是这样,你可以根据你是否需要从不同的AsyncTask
方法或任务本身传递东西来调整implimentation以满足你的需求。
答案 3 :(得分:0)
我建议您仔细阅读ListView
和AsyncTask
的基础知识。
您的方法中存在一些基本错误,例如
如何在我的以下自定义Listview和解析中调用异步调用 json填写Listview
一个人不会从AsyncTask
拨打ListView
来填充ListView
本身。最佳实践说,您总是在用户生成的事件(如按钮点击)上调用AsyncTask,当您在PostExecute
AsyncTask
上获得响应时,从那里启动ListViewActivity!
以下是一些很好的教程:
答案 4 :(得分:0)
致电new AsyncAction().execute(null, null, null);
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Builder builder = new AlertDialog.Builder(this);
builder.setMessage(item[position] + " is clicked.");
builder.setPositiveButton("OK", null);
builder.show();
}
private class AsyncAction extends AsyncTask<String, Void, String> {
public boolean status = false;
private ProgressDialog pd;
@Override
protected String doInBackground(String... arg0) {
// TODO Auto-generated method stub
try {
status = true;
//Crearte instance to http call
getCall=new GetHttpCall();
String response=null;
try {
response=getCall.connect();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
JSONParser _parser=new JSONParser();
_parser.parseHttpJson(response);
item = JSONParser.num_title;
id=JSONParser.num_id;
videos=new ArrayList<Video>();
for(int i=0;i<item.length;i++)
{
Video vid=new Video();
vid.setTitle(item[i]);
vid.setId(id[i]);
videos.add(vid);
}
getListView().setDividerHeight(2);
} catch (Exception e) {
// TODO: handle exception
}
return null;
}
@Override
protected void onPostExecute(String result) {
pd.dismiss();
getListView().setAdapter(new BindDataAdapter(this, videos));
}
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
pd = new ProgressDialog(listmessages.this);
pd.setMessage("loading...");
pd.setIndeterminate(true);
pd.setCancelable(false);
pd.show();
}
}
}
}