我从服务器获取数据并将此数据传递给自定义适配器以在图像适配器上显示它。我正在使用asynchtask来获取数据。我的问题是我想在每5秒后更改列表视图中的图像。请建议我一个解决方案。这是我的活动文件
public class MainActivity extends Activity {
private String[] image,name,descr;
ListView list;
LazyImageLoadAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String serverURL = "http://10.0.2.2/JsonReturn.php";
// Use AsyncTask execute Method To Prevent ANR Problem
new LongOperation().execute(serverURL);
list=(ListView)findViewById(R.id.list);
Button b=(Button)findViewById(R.id.button1);
b.setOnClickListener(listener);
// Create custom adapter for listview
}
@Override
public void onDestroy()
{
// Remove adapter refference from list
list.setAdapter(null);
super.onDestroy();
}
public OnClickListener listener=new OnClickListener(){
@Override
public void onClick(View arg0) {
//Refresh cache directory downloaded images
adapter.imageLoader.clearCache();
adapter.notifyDataSetChanged();
}
};
public void onItemClick(int mPosition)
{
String tempValues = image[mPosition];
Toast.makeText(MainActivity.this,
"Image URL : "+tempValues,
Toast.LENGTH_LONG)
.show();
}
private class LongOperation extends AsyncTask<String, Void, Void> {
// Required initialization
ListView lst=(ListView)findViewById(R.id.list);
private final HttpClient Client = new DefaultHttpClient();
private String Content;
private String Error = null;
private ProgressDialog Dialog = new ProgressDialog(MainActivity.this);
String data ="";
//TextView uiUpdate = (TextView) findViewById(R.id.output);
/// TextView jsonParsed = (TextView) findViewById(R.id.jsonParsed);
int sizeData = 0;
// EditText serverText = (EditText) findViewById(R.id.serverText);
protected void onPreExecute() {
// NOTE: You can call UI Element here.
//Start Progress Dialog (Message)
Dialog.setMessage("Please wait..");
Dialog.show();
try{
// Set Request parameter
data +="&" + URLEncoder.encode("data", "UTF-8")+ "="+"RAja";//serverText.getText();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Call after onPreExecute method
protected Void doInBackground(String... urls) {
/************ Make Post Call To Web Server ***********/
BufferedReader reader=null;
// Send data
try
{
// Defined URL where to send data
URL url = new URL(urls[0]);
// Send POST data request
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write( data );
wr.flush();
// Get the server response
reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = null;
// Read Server Response
while((line = reader.readLine()) != null)
{
// Append server response in string
sb.append(line + "\n");
}
// Append Server Response To Content String
Content = sb.toString();
}
catch(Exception ex)
{
Error = ex.getMessage();
}
finally
{
try
{
reader.close();
}
catch(Exception ex) {}
}
/*****************************************************/
return null;
}
protected void onPostExecute(Void unused) {
// NOTE: You can call UI Element here.
// Close progress dialog
Dialog.dismiss();
if (Error != null) {
Toast.makeText(getApplicationContext(), "Error"+Error, Toast.LENGTH_LONG).show();;
//uiUpdate.setText("Output : "+Error);
} else {
// Show Response Json On Screen (activity)
//uiUpdate.setText( Content );
Toast.makeText(getApplicationContext(), "content"+Content, Toast.LENGTH_LONG).show();;
/****************** Start Parse Response JSON Data *************/
String OutputData = "";
JSONObject jsonResponse;
try {
/****** Creates a new JSONObject with name/value mappings from the JSON string. ********/
jsonResponse = new JSONObject(Content);
/***** Returns the value mapped by name if it exists and is a JSONArray. ***/
/******* Returns null otherwise. *******/
JSONArray jsonMainNode = jsonResponse.optJSONArray("Android");
/*********** Process each JSON Node ************/
int lengthJsonArr = jsonMainNode.length();
image=new String[lengthJsonArr];
name=new String[lengthJsonArr];
descr=new String[lengthJsonArr];
for(int i=0; i < lengthJsonArr; i++)
{
/****** Get Object for each JSON node.***********/
JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
/******* Fetch node values **********/
String nm = jsonChildNode.optString("name").toString();
String img = jsonChildNode.optString("image").toString();
String desc = jsonChildNode.optString("desc").toString();
image[i]=img;
name[i]=nm;
descr[i]=desc;
OutputData += " Name : "+ nm +" \n "
+ "Number : "+ img +" \n "
+ "Time : "+ desc +" \n "
+"--------------------------------------------------\n";
//Log.i("JSON parse", song_name);
}
/****************** End Parse Response JSON Data *************/
//Show Parsed Output on screen (activity)
//jsonParsed.setText( OutputData );
Toast.makeText(getApplicationContext(), "Parsed Data"+ OutputData, Toast.LENGTH_LONG).show();;
adapter=new LazyImageLoadAdapter(MainActivity.this, image,name,descr);
//Set adapter to listview
list.setAdapter(adapter);
//lst.setAdapter(adapter);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
}
我的图像适配器类文件如下
public class LazyImageLoadAdapter extends BaseAdapter implements OnClickListener{
private Activity activity;
private String[] data,name,desc;
private static LayoutInflater inflater=null;
public ImageLoader imageLoader;
public LazyImageLoadAdapter(Activity a, String[] d,String[] name,String[] desc) {
activity = a;
data=d;
this.name=name;
this.desc=desc;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// Create ImageLoader object to download and show image in list
// Call ImageLoader constructor to initialize FileCache
imageLoader = new ImageLoader(activity.getApplicationContext());
}
public int getCount() {
return data.length;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
/********* Create a holder Class to contain inflated xml file elements *********/
public static class ViewHolder{
public TextView text;
public TextView text1;
public TextView textWide;
public ImageView image;
}
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
ViewHolder holder;
if(convertView==null){
/****** Inflate tabitem.xml file for each row ( Defined below ) *******/
vi = inflater.inflate(R.layout.listview_row, null);
/****** View Holder Object to contain tabitem.xml file elements ******/
holder = new ViewHolder();
holder.text = (TextView) vi.findViewById(R.id.text);
holder.text1=(TextView)vi.findViewById(R.id.text1);
holder.image=(ImageView)vi.findViewById(R.id.image);
/************ Set holder with LayoutInflater ************/
vi.setTag( holder );
}
else
holder=(ViewHolder)vi.getTag();
holder.text.setText(name[position]);
holder.text1.setText(desc[position]);
ImageView image = holder.image;
//DisplayImage function from ImageLoader Class
imageLoader.DisplayImage(data[position], image);
/******** Set Item Click Listner for LayoutInflater for each row ***********/
vi.setOnClickListener(new OnItemClickListener(position));
return vi;
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
}
/********* Called when Item click in ListView ************/
private class OnItemClickListener implements OnClickListener{
private int mPosition;
OnItemClickListener(int position){
mPosition = position;
}
@Override
public void onClick(View arg0) {
MainActivity sct = (MainActivity)activity;
sct.onItemClick(mPosition);
}
}
}
我试图将set adapter()方法放在oncreate()的活动中,但它给了我错误。那么如何在特定时间后更改列表视图中的图像显示?请提出解决方案。
我在list.setAdapter(adapter)中得到nullpointer异常;声明
答案 0 :(得分:0)
移动此行list =(ListView)findViewById(R.id.list);在这一行之上,新的LongOperation()。execute(serverURL);
答案 1 :(得分:0)
你的声明在这里是错误的
你的代码// Use AsyncTask execute Method To Prevent ANR Problem
new LongOperation().execute(serverURL);
list=(ListView)findViewById(R.id.list);
此处您在调用ListView
后声明了AsyncTask
,因此在ListView
设置的时间内永远找不到Adapter
。
list=(ListView)findViewById(R.id.list);
// Use AsyncTask execute Method To Prevent ANR Problem
new LongOperation().execute(serverURL);
初始化时出现问题。