将列表视图的数据从Asynctask传递到自定义列表适配器类

我需要帮助传递自定义列表视图的数据,我似乎无法将数据从asynctask传递到其他java类。 这是我的代码:

import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.SimpleAdapter; import com.dmo.d2d.R; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.HashMap; import java.util.List; public class Inventory extends Activity { //Variables!!!!!!!!! // url to get all products list private static String url_all_products = "my server url :D"; // Get name and email from global/application context final String accnt_user_name = globalVariable.getUserName(); private static final String TAG_SUCCESS = "success"; private static final String TAG_PRODUCTS = "vinID"; static final String TAG_CAR_NAME = "carName"; static final String TAG_VIN_ID = "vinID"; ListView list; CustomInventoryList adapter; JSONObject json; // Creating JSON Parser object JSONParser jParser = new JSONParser(); ArrayList<HashMap> productsList = new ArrayList<HashMap>(); // products JSONArray JSONArray products = null; // contacts JSONArray JSONArray contacts = null; JSONArray account = null; JSONArray cars = null; JSONArray user_names = null; JSONObject jsonObj; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); //Remove title bar this.requestWindowFeature(Window.FEATURE_NO_TITLE); //Remove notification bar this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); //set content view AFTER ABOVE sequence (to avoid crash) this.setContentView(R.layout.inventory_list); new LoadAllProducts().execute(); } /** * Background Async Task to Load all product by making HTTP Request * */ class LoadAllProducts extends AsyncTask { @Override protected String doInBackground(String... args) { // TODO Auto-generated method stub // Building Parameters List params = new ArrayList(); params.add(new BasicNameValuePair("username_GET", accnt_user_name )); // getting JSON string from URL json = jParser.makeHttpRequest(url_all_products, "GET", params); // Check your log cat for JSON reponse Log.d("All Products: ", json.toString()); runOnUiThread(new Runnable() { public void run() { try { // Checking for SUCCESS TAG int success = json.getInt(TAG_SUCCESS); if (success == 1) { // products found // Getting Array of Products products = json.getJSONArray(TAG_PRODUCTS); // looping through All Products for (int i = 0; i < products.length(); i++) { JSONObject c = products.getJSONObject(i); // Storing each json item in variable String vinID = c.getString("vinID"); String name = c.getString("carName").replaceAll("_", " "); // globalVariable.setUserComment(dealer); // creating new HashMap HashMap map = new HashMap(); // adding each child node to HashMap key => value map.put(TAG_CAR_NAME, name); map.put(TAG_VIN_ID, vinID); // adding HashList to ArrayList productsList.add(map); } } else { // no products found // Launch Add New product Activity } } catch (JSONException e) { e.printStackTrace(); } } }); return null; } protected void onPostExecute(String file_url) { list=(ListView)findViewById(R.id.list); adapter=new CustomInventoryList(this, productsList); << I CAN'T PASS THIS DATA!!! list.setAdapter(adapter); } } } 

我无法传递列表视图的数据,这是我的CustomInventoryList.java:

 import android.app.Activity; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import com.dmo.d2d.R; import java.util.ArrayList; import java.util.HashMap; public class CustomInventoryList extends BaseAdapter{ private Activity activity; private ArrayList<HashMap> data; private static LayoutInflater inflater=null; // public ImageLoader imageLoader; public CustomInventoryList(Activity a, ArrayList<HashMap> d) { activity = a; data=d; inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); //imageLoader=new ImageLoader(activity.getApplicationContext()); } public int getCount() { return data.size(); } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { View vi=convertView; if(convertView==null) vi = inflater.inflate(R.layout.list_inventory, null); TextView title = (TextView)vi.findViewById(R.id.title); TextView artist = (TextView)vi.findViewById(R.id.artist); TextView duration = (TextView)vi.findViewById(R.id.duration); ImageView thumb_image=(ImageView)vi.findViewById(R.id.list_image); HashMap song = new HashMap(); song = data.get(position); // Setting all values in listview title.setText(song.get(Inventory.TAG_VIN_ID)); artist.setText(song.get(Inventory.TAG_VIN_ID)); // duration.setText(song.get(Inventory.KEY_DURATION)); // imageLoader.DisplayImage(song.get(CustomizedListView.KEY_THUMB_URL), thumb_image); return vi; } } 

我从androidHive获得了代码,我正在尝试修改它。 所以在回顾中:

  1. 我无法将数据从Inventory.java中的asynctask传输到CustomInventoryList.java

  2. 我怎么能解决它?

先谢谢你。 :)很抱歉很长的post,但我真的需要帮助。 🙁

哦顺便说一句,我还没有logcat。 因为我无法从异步任务传递数据。

首先,您应该考虑将doInBackground的Runnable块移动到onPostExecute因为这就是为什么它是为后台任务后的UI线程操作而设计的。

请注意您的AsyncTask类型已更改

您还可以考虑使AsyncTask与您的Activity独立,使其保持static 。 然后,您只需在构造函数中传递任务所需的参数,以及对活动的引用,以便它可以在onPostExecute返回结果。

想法:

 private ListView mList; public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); // ... mlist = ... new LoadAllProducts(this, username, params, ...); // PASS ALL THE PARAMTERS THE ASYNCTASK NEEDS } public void populateList(ArrayList> productsList) { mList.setAdapter(new CustomInventoryList(this, productsList)); } static class LoadAllProducts extends AsyncTask { private String username; private List params; private Activity mActivity; public LoadAllProducts(...) { username = ...; params = ...; mActivity = ...; } @Override protected String doInBackground(String... args) { ... // getting JSON string from URL json = jParser.makeHttpRequest(url_all_products, "GET", params); return json; } protected void onPostExecute(JSONObject json) { try { // Checking for SUCCESS TAG int success = json.getInt(TAG_SUCCESS); if (success == 1) { // ... handle your JSON } } catch (JSONException e) { e.printStackTrace(); } mActivity.populateList(productsList); } }