【问题标题】:Pass Asynctask JSON result to ListFragment将 Asynctask JSON 结果传递给 ListFragment
【发布时间】:2014-09-30 13:11:08
【问题描述】:

我有一个ListFragment 我需要在其中显示列表项。但我想我无法将我的列表从AsyncTask 传递到ListFragment。这是我的代码。

FragmentTwo.java

package com.apitech.sitebilgi;
import ...

public class FragmentTwo extends ListFragment {

    public FragmentTwo (){}

    private ProgressDialog pDialog;
    // JSON Node Names
    private static final String TAG_SITELER = "Siteler";
    private static final String TAG_SITE_ID = "siteid";
    private static final String TAG_SITE_URL = "siteurl";
    private static final String TAG_DIL = "dil";

    // Siteler ListView
    ListView sitelerLV = null;

    // siteler JSONArray
    JSONArray siteler = null;

    // Hashmap for ListView
    ArrayList<HashMap<String, String>> siteList;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_layout_two, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);

        siteList = new ArrayList<HashMap<String, String>>();
        sitelerLV = getListView();
        new GetSiteler().execute();

    }

    private class GetSiteler extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();

            // Showing progress dialog
            pDialog = new ProgressDialog(getActivity());
            pDialog.setMessage("Siteleriniz Yükleniyor...");
            pDialog.setCancelable(false);
            pDialog.show();
        }

        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub

            final Thread t = new Thread (new Runnable() {

                @Override
                public void run() {
                        HttpClient httpclient = new DefaultHttpClient();
                        HttpPost httppost = new HttpPost(getResources().getString(R.string.site_fetch_url) + "?");

                        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                        nameValuePairs.add(new BasicNameValuePair("request", "sites"));
                        nameValuePairs.add(new BasicNameValuePair("userid", "24"));

                        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,
                                "UTF-8"));

                        HttpResponse response = httpclient.execute(httppost);
                        HttpEntity entity = response.getEntity();
                        final String siteYanit = EntityUtils.toString(entity);
                        JSONObject jsonObj = new JSONObject(siteYanit);
                        siteler = jsonObj.getJSONArray(TAG_SITELER);

                        for (int i=0; i<siteler.length(); i++) {
                            JSONObject s = siteler.getJSONObject(i);

                            String id = s.getString(TAG_SITE_ID);
                            String siteurl = s.getString(TAG_SITE_URL);
                            String dil = s.getString(TAG_DIL);

                            // Temporary HashMap for Single Data
                            HashMap<String, String> site = new HashMap<String, String>();

                            // Adding each child node to Hashmap key => value
                            site.put(TAG_SITE_ID, id);
                            site.put(TAG_SITE_URL, siteurl);
                            site.put(TAG_DIL, dil);
                            // Log.d("Siteler", siteurl);
                            // Adding site to siteList
                            siteList.add(site);
                        }

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
            t.start();
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            // Dismiss the progress dialog
            if (pDialog.isShowing())
                pDialog.dismiss();
            /**
             * Updating parsed JSON data into ListView
             */
            ListAdapter adapter = new SimpleAdapter(getActivity(), siteList, R.layout.sitelerim_list_item,
                new String[] {TAG_SITE_URL}, new int[] {R.id.sitelerim_site_adi});
            setListAdapter(adapter);
        }
    }
}

fragment_layout_two.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:baselineAligned="false"
    android:orientation="horizontal"
    android:background="@drawable/bg"
    >

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:scrollbars="vertical"
        android:background="#00FF00"
        android:divider="#FFCC00"
        android:dividerHeight="10dp" />

    <TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/list_item_title"
        android:text="new text"
        android:id="@android:id/empty"
        android:layout_gravity="left|center_vertical"/>

</LinearLayout>

这是我的列表视图的单行 xml

sitelerim_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/sitelerim_site_button" >

    <TextView 
        android:id="@+id/sitelerim_site_adi"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:contentDescription="@string/desc_list_item_icon" />

</RelativeLayout>

这些是我的相关代码。我需要添加什么代码才能看到片段上的列表?

【问题讨论】:

  • 您需要创建自己的适配器(扩展 BaseAdapter 的类),然后将您的数组列表传递给它,并在类的 getView() 方法中使用数据。 (为您的列表设置此适配器 setListAdapter(适配器))
  • 你能详细说明你的答案吗?我不认为我理解它。因为我是android的初学者
  • 你为什么要在doInBackground创建一个线程?你在哪里看到的?
  • 我从未见过doInBackground 中的线程实现,但我之前在另一个项目的onCreate 方法中使用过它,看来我也可以在这里使用它。不建议在doInBackground 中使用线程吗?因为我成功获取了我的 JSON,但我无法让它在 ListFragment 中填充我的 ListView
  • @jnzk2 我忘了在我的评论中提到你很抱歉

标签: android json android-asynctask fragment android-listfragment


【解决方案1】:

你当然不应该在你的 doInBackground() 中创建这样的话题。

AsyncTask 的工作原理如下:

  1. onPreExecute() 在 GUI 线程上运行;这意味着它可以更新 GUI 元素,但不能执行任何长时间运行的任务,因为这会锁定应用程序。
  2. doInBackground() 自动在后台线程上运行。您无需为此创建单独的线程:这就是使用此类的全部意义所在。这意味着它可以根据需要运行,但它不得与任何 GUI 元素交互,因为这只能在 GUI 线程中完成。
  3. onPostExecute() 在 GUI 线程上运行;这是可以将长 doInBackground() 计算的任何结果应用于任何 GUI 元素的地方。

剩下的唯一问题是如何将doInBackground() 操作的结果传递给onPostExecute()

您可能会注意到AsyncTask 是一个参数化类。你已经创建了一个需要三个Void 的对象,如下所示:

AsyncTask<Void, Void, Void>

我暂时不用担心前两个类型参数,但第三个很重要。它指定doInBackground() 的结果类型,以及传递给onPostExecute() 的参数。因此,如果您将其更改为(例如)

AsyncTask<Void, Void, ArrayList<HashMap<String, String>>>

那么您需要将doInBackground() 的返回类型设为ArrayList&lt;HashMap&lt;String, String&gt;&gt;。您可以在该方法中构建其中一个,通过从远程服务器或其他任何方式读取 JSON,然后在最后 return 它。现在您的 onPostExecute() 方法也将采用其中之一作为参数:

protected void onPostExecute(ArrayList<HashMap<String, String>> myList) {
    //...
}

在那里,您可以使用在doInBackground() 中创建的列表做您想做的事情,并将其应用到您希望的 GUI 元素。

【讨论】:

  • 非常感谢您的回答@chiastic-security。感谢您的建议,我解决了我的问题。我在这里stackoverflow.com/questions/26156269/…问了一个与此相关的问题,也许你也想在那里检查答案。祝你有美好的一天
猜你喜欢
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多