2013-08-25 76 views
0

好的。所以我得到了我的數據庫的一部分(元素的名稱)以列表視圖顯示。我現在希望能夠選擇其中一個元素並將選擇傳遞給一個新的片段,從數據庫中調用與該元素有關的其他信息(即原子序數,質量,熔點等)。我如何將選定的元素傳遞給我的新片段。這是我目前正在嘗試的:數據庫:從列表視圖到佈局

private void selectElement(int position){ 

    elementFragment fragment = new elementFragment(); 
    fragment.loadElement(position); 

    FragmentManager fragmentManager = getFragmentManager(); 
    fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit(); 

} 

然後讓它加載其餘的相關信息嗎?數據庫中的每個條目都有一個我希望加載它的特定視圖,但我也願意嘗試將其加載到自定義列表視圖中。 (當我查看相冊內容時,我的外觀與Google Music Play應用程序相似)

以下是我現在正在玩的遊戲。

public void loadElement(int position) { 
    mPosition = position; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View viewElement = inflater.inflate(R.layout.fragment_element_detail, container, false); 

    Cursor c = myDB.getRow(mPosition); 

    String name = DataBaseHelper.KEY_NAME; 

    String[] fromFieldNames = new String[] 
      {DataBaseHelper.KEY_NAME, DataBaseHelper.KEY_ATOMIC_NUMBER, DataBaseHelper.KEY_ATOMIC_WEIGHT, 
      DataBaseHelper.KEY_OXIDATION, DataBaseHelper.KEY_BOILING_POINT, 
      }; 

    elementName = (TextView) viewElement.findViewById(R.id.nameElement); 
    elementName.setText(name); 

    return viewElement; 
} 

我繼續前進,並刪除了一些字段以幫助清理一些字段。

我得到的最後一個錯誤是當我在我的elementFragment中調用Cursor時,出於某種原因它繼續失敗。這裏是logcat的副本。

08-28 07:37:20.712: E/AndroidRuntime(1093): FATAL EXCEPTION: main 
08-28 07:37:20.712: E/AndroidRuntime(1093): java.lang.NullPointerException 
08-28 07:37:20.712: E/AndroidRuntime(1093):  at table.periodic.elementFragment.onCreateView(elementFragment.java:33) 
08-28 07:37:20.712: E/AndroidRuntime(1093):  at android.app.Fragment.performCreateView(Fragment.java:1785) 
08-28 07:37:20.712: E/AndroidRuntime(1093):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:887) 
08-28 07:37:20.712: E/AndroidRuntime(1093):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1059) 
08-28 07:37:20.712: E/AndroidRuntime(1093):  at android.app.BackStackRecord.run(BackStackRecord.java:682) 
08-28 07:37:20.712: E/AndroidRuntime(1093):  at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1437) 
08-28 07:37:20.712: E/AndroidRuntime(1093):  at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443) 
08-28 07:37:20.712: E/AndroidRuntime(1093):  at android.os.Handler.handleCallback(Handler.java:725) 
08-28 07:37:20.712: E/AndroidRuntime(1093):  at android.os.Handler.dispatchMessage(Handler.java:92) 
08-28 07:37:20.712: E/AndroidRuntime(1093):  at android.os.Looper.loop(Looper.java:158) 
08-28 07:37:20.712: E/AndroidRuntime(1093):  at android.app.ActivityThread.main(ActivityThread.java:5751) 
08-28 07:37:20.712: E/AndroidRuntime(1093):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-28 07:37:20.712: E/AndroidRuntime(1093):  at java.lang.reflect.Method.invoke(Method.java:511) 
08-28 07:37:20.712: E/AndroidRuntime(1093):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1083) 
08-28 07:37:20.712: E/AndroidRuntime(1093):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:850) 
08-28 07:37:20.712: E/AndroidRuntime(1093):  at dalvik.system.NativeStart.main(Native Method) 

elementFragment.Java:33對應於我的代碼中的Cursor c = myDB.getRow(mPosition);

感謝您的幫助。

+0

看起來'mDB'是'null'。你在哪裏初始化? –

+0

@MattiasBuelens你的意思是我在哪裏打開數據庫?我在一個名爲elementList的片段中打開它,並將我的數據庫中的名稱列加載到列表視圖中。它通過點擊那個listview來調用elementFragment。我假設由於數據庫已經打開,我不需要再次調用它。我已經添加了一個openDB();到elementFragment,但通知沒有區別。 –

回答

0

您可以在您的自定義ElementFragment添加一個簡單的loadElement並把它作爲片段創建後:

protected void onListItemClick (ListView l, View v, int position, long id) { 
    // Create fragment 
    ElementFragment fragment = new ElementFragment(); 

    fragment.loadElement(position); // you might also want the id 

    // start activity or launch fragment transition 
    // then onCreateView will be probably called 
    ... 
} 

public class ElementFragment extends Fragment { 
    private int mPosition = -1; 

    public void loadElement(int position) { 
     mPosition = position; 
    } 

而剛剛拿到的onCreateView方法的正確值:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View viewElement = inflater.inflate(R.layout.fragment_element_detail, container, false); 

     Cursor c = myDB.getRow(mPosition); 

     ... 

     return viewElement; 
    } 
} 

編輯:Fragment fragment...取而代之的是ElementFragment fragment...

+0

Buzegg:謝謝你的迴應。我添加了您提供的建議,並遇到問題。當我調用.loadElement(position)時,Eclipse告訴我「方法loadElement(int)對於Fragment類型是未定義的」。因爲我編輯了它,所以請參閱上面的代碼。 此外,一旦我得到我的光標檢索正確的行,我如何將該行的信息綁定到textview? (我有大約20列到每行)還看到我得到的光標錯誤。謝謝 –

+0

@JoshuaSutherland在'onListItemClick'的第一行中將'fragment'的靜態類型從'Fragment'改爲'ElementFragment'。 –

+0

你說得對。我做了一個編輯。關於綁定,你從fromFieldNames開始很好。現在,您必須繼續使用適配器:請參閱doc中的示例:http://developer.android.com/guide/topics/ui/layout/listview.html#Example – buzeeg