java - 将 ListView 的数据从 Asynctask 传递到自定义列表适配器类

标签 java android json listview android-asynctask

我需要有关为自定义 ListView 传递数据的帮助,我似乎无法将数据从 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<String, String>> productsList = new ArrayList<HashMap<String, String>>();

    // 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<String, String, String> {

        @Override
        protected String doInBackground(String... args) {
            // TODO Auto-generated method stub
            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            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<String, String> map = new HashMap<String, String>();

                                // 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);


        }


    }

}

我无法传递 ListView 的数据,这是我的 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<String, String>> data;
    private static LayoutInflater inflater=null;
  //  public ImageLoader imageLoader;

    public CustomInventoryList(Activity a, ArrayList<HashMap<String, String>> 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<String, String> song = new HashMap<String, String>();
        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. 我该如何解决这个问题?

提前谢谢您。 :) 很抱歉这篇文章很长,但我真的需要帮助。 :(

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

最佳答案

首先,您确实应该考虑将 doInBackground 中的 Runnable block 移动到 onPostExecute,因为这就是它设计用于后台任务之后的 UI 线程操作的原因。

请注意,您的 AsyncTask 类型已更改

您还可以考虑将 AsyncTask 设置为静态,使其独立于 Activity。然后,您只需在其构造函数中传递任务所需的参数,以及对 Activity 的引用,以便它可以在 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<HashMap<String, String>> productsList) {
    mList.setAdapter(new CustomInventoryList(this, productsList));
}

static class LoadAllProducts extends AsyncTask<String, String, JSONObject> {
    private String username;
    private List<NameValuePair> 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);
   }
}

关于java - 将 ListView 的数据从 Asynctask 传递到自定义列表适配器类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24608604/

相关文章:

android - 如何在 android 中获取多个公共(public) facebook 页面提要数据?

java - 为什么这个android函数总是返回false?

javascript - 在 JavaScript 中从 JSON 构建 XML 格式

java - Spring MVC 创建对象请求

java - 是否可以从 Spring 中的 scriptlet 调用 Controller 方法

android - 为 SlidingMenu 创建 jar 文件

json - 如何在 Scala/Lift 中构造和解析 JSON 字符串

php - 从 php 文件在 mysql 数据库中插入 JSON 数组

java - 在 HashMap 中遍历另一个对象中的每个对象?

java - BufferedImage 比较显示奇怪的行为