1

在过去的几天里,我一直在尝试从当前的 listactivity 到 listfragment。我通过一个很好的 ArrayAdapter 将数据加载到我的 Listactivity 中。数据首先从远程服务器收集,然后插入 SQLite 数据库。呈现数据时,我将数据加载到自定义 BaseAdapter 中。所有这一切都很好。我真的很想通过使用 listfragments 来更新我的 UI。这尤其是因为我有很多使用平板电脑的客户。

我知道如何为平板电脑创建更大的视图,但希望我的应用程序能够像在 iPad 中一样呈现。据我了解,可以使用片段来做到这一点。到目前为止,我已经设法让 listfragments 使用静态数据。问题是我不知道如何将数组适配器中存在的数据加载到 listfragment 中。

我使用异步任务在列表视图中检索、存储和呈现数据。

谁能帮我将异步任务中的数据加载到列表片段中?目前,我将所有内容加载到列表活动中的列表视图中。

谢谢

4

2 回答 2

4

以下是基本场景的分步指南:

1)创建一个新的 fragment.java 文件,其中包含一个片段的超级简单实现。

package com.a;

import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

public class MenuFragment extends ListFragment 
{

public static final String TAG = "MenuFragment";

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    v = inflater.inflate(R.layout.list, null);
    return v;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    //
    // insert code here to setup and call setListAdapter()
    //
}

@Override
public void onListItemClick(ListView lv, View v, int position, long id) 
{

}
}

2) 在您的 listactivity 代码中查找您的 setContentView,将该布局用作 onCreateView() 下的 inflate() 调用的参数

setContentView(R.layout.main);

View v = inflater.inflate(R.layout.main, null);

3) 将您的 listactivity onCreate() 下的其余代码移动到 listfragmentt OnCreateView()。您可能有一些代码设置控件,如下所示:

text = (EditText) this.findViewById(R.id.text);

它会变成这样:

text = (EditText) v.findViewById(R.id.text);

请注意,v 是从 inflate 调用返回的视图。

4)如果你的代码引用了“this”,你会得到一个错误。将其替换为“getActivity()”。

5)检查你留下了哪些代码,并找到合适的地方将它们放入新文件中。希望以上内容涵盖了基础知识。

于 2014-01-07T08:58:16.350 回答
1

本质上它必须是相同的。只是容器不同(活动到片段),内部实现理想情况下应该保持不变。所以我想说创建 AsyncTask 使用相同的组件,在 onPostExecute() 方法中,你可以做一个 setListAdapter(adapter),如下所示:

class MyFragment extentsListFragment{

//define constructors if any 
public void onResume(){

    LoadData loadData = new LoadData();
    loadData.execute();

}
//unimplementedMethods





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

    private Object object = null;

    protected Void doInBackground(Void... params) {

        //make a call to the server and save the data in SQLite DB
        // Make a call to the database to get your data
        object = getObjectFromDB();

        return null;
    }

    protected void onPostExecute(Void result) {
        if(object == null || object.length <= 0) {
            setListAdapter(null);
            return;
        }




        // assuming object has your data, say it's an Array  List, work on it and setListAdapter
        adapter = ...
        setListAdapter(adapter)
    }

    private Object getObjectFromDB() {
        // do whatever
        return object;
    }
}

}

于 2012-12-25T13:53:50.707 回答