2012-12-25 57 views
1

在過去的幾天裏,我一直在嘗試從當前listactivity到listfragment。我通過一個很好的ArrayAdapter將數據加載到我的Listactivity中。數據首先從遠程服務器收集,然後插入到SQLite數據庫中。當呈現數據時,我將數據加載到自定義BaseAdapter中。所有這些都很好。我真的想通過使用listfragments來更新我的UI。這尤其是因爲我有很多使用平板電腦的客戶。從Listactivity到Listfragment

我知道如何爲平板電腦創建更大的視圖,但希望我的應用能像iPad一樣呈現。據我瞭解,可以用碎片來做到這一點。到目前爲止,我已經設法得到了使用靜態數據的listfragments。問題是我不知道如何將數組適配器中存在的數據加載到listfragment中。

我使用異步任務來檢索,存儲和呈現列表視圖中的數據。

任何人都可以幫助我從異步任務加載數據到listfragment?目前,我將所有內容加載到列表視圖的列表視圖中。

謝謝

+0

我讀過以下內容:http://developer.android.com/design/patterns/multi-pane-layouts.html。但不能設法改變我有什麼這樣的 – Bami

回答

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

}

+0

謝謝stack_ved,我會實現這一點,並得到回報給你。 – Bami

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下調用()

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)檢查你已經離開的代碼,並找到正確的位置將它們放入新文件中。希望以上內容涵蓋了基礎知識。