【问题标题】:Going from Listactivity to Listfragment从 Listactivity 到 Listfragment
【发布时间】:2012-12-25 13:35:01
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

标签: android listview android-asynctask android-fragments


【解决方案1】:

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

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)检查您留下的代码,并找到将它们放入新文件的正确位置。希望以上内容涵盖了基础知识。

【讨论】:

    【解决方案2】:

    本质上必须相同。只是容器不同(活动到片段),内部实现理想情况下应该保持不变。所以我想说创建 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;
        }
    }
    

    }

    【讨论】:

    • 感谢 stack_ved,我会实施并回复您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多