从Listactivity到Listfragment

时间:2012-12-25 13:35:02

标签: android listview android-asynctask android-fragments

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

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

我使用异步任务来检索,存储和显示列表视图中的数据。

有人可以帮我将异步任务中的数据加载到listfragment中吗?目前,我将所有内容加载到listactivity中的列表视图中。

由于

2 个答案:

答案 0 :(得分: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是从膨胀调用返回的视图。

4)如果您的代码引用了“this”,您将收到错误消息。将其替换为“getActivity()”。

5)检查您剩下的代码,找到将它们放入新文件的正确位置。希望以上内容涵盖了基础知识。

答案 1 :(得分:1)

基本上它必须是相同的。只是容器不同(Activity to Fragment),理想情况下内部实现应保持不变。所以我会说创建AsyncTask使用相同的组件,在onPostExecute()方法中,你可以做一个setListAdapter(适配器),如下所示:

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;
    }
}

}