2015-04-03 25 views
0

我遇到了無法在listfragment中的數據庫中顯示我的數據的問題。目前我正在使用SimpleCursorAdapter顯示我的數據,但是一旦我點擊我的按鈕,它就會顯示沒有數據。使用ListFragment從數據庫中獲取項目

這是我MovieListFragment擴展ListFragment代碼:

package com.example.moviemanager; 

import android.database.Cursor; 
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; 
import android.widget.SimpleCursorAdapter; 
import android.widget.Toast; 


public class MovieListFragment extends ListFragment { 
    DatabaseHandler dh = new DatabaseHandler(getActivity()); 
    private static final String ROW_ID = "row_id"; 
    private listMovieActivity parent; 


    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.displaymoviemenu, container, false); 
     parent = (listMovieActivity) getActivity(); 
     populateListViewFromDB(); 

     return v; 
    } 


    private void openDB() { 
     dh.open(); 
    } 

    private void closeDB() { 
     dh.close(); 
    } 

    private void populateListViewFromDB() { 
     Cursor cursor = dh.getAllRows(); 

     // Allow activity to manage lifetime of the cursor. 
     // DEPRECATED! Runs on the UI thread, OK for small/short queries. 
     getActivity().startManagingCursor(cursor); 

     // Setup mapping from cursor to view fields: 
     String[] fromFieldNames = new String[] 
       {dh.KEY_KEY, dh.KEY_TITLE}; 
     int[] toViewIDs = new int[] 
       {R.id.txtMovieId, R.id.txtMovieTitleRow}; 

     // Create adapter to may columns of the DB onto elemesnt in the UI. 
     SimpleCursorAdapter myCursorAdapter; 
     myCursorAdapter = new SimpleCursorAdapter(
       getActivity(),// Context 
       android.R.layout.simple_list_item_1, // Row layout template 
       cursor,     // cursor (set of DB records to map) 
       fromFieldNames,   // DB Column names 
       toViewIDs    // View IDs to put information in 
     ); 

     // Set the adapter for the list view 
     ListView movieList = (ListView) getView().findViewById(android.R.id.list); 
     movieList.setAdapter(myCursorAdapter); 
    } 

    @Override 
    public void onListItemClick(ListView list, View view, int position, long id) { 
     // TODO: show detail depending on activity 
     String a=list.getItemAtPosition(position).toString(); 
     System.out.println(a); 
     parent.showDetails(position,a); 
    } 


    private void displayToastForId(long idInDB) { 
     Cursor cursor = dh.getRow(idInDB); 
     if (cursor.moveToFirst()) { 
      long idDB = cursor.getLong(dh.COL_ROWID); 
      String mvkey = cursor.getString(dh.COL_KEY); 
      String mvtitle = cursor.getString(dh.COL_TITLE); 
      //String favColour = cursor.getString(DBAdapter.COL_FAVCOLOUR); 

      String message = "ID: " + idDB + "\n" 
        + "Name: " + mvtitle + "\n" 
        + "Key#: " + mvkey; 
      //+ "FavColour: " + favColour; 
      Toast.makeText(getActivity(), message, Toast.LENGTH_LONG).show(); 
     } 
     cursor.close(); 
    } 
} 

這是錯誤代碼:

04-03 13:31:00.745 6713-6713/com.example.moviemanager E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.moviemanager/com.example.moviemanager.listMovieActivity}: android.view.InflateException: Binary XML file line #7: Error inflating class fragment 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
      at android.app.ActivityThread.access$600(ActivityThread.java:141) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
      at android.os.Handler.dispatchMessage(Handler.java:99) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:5041) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:511) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class fragment 
      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
      at android.view.LayoutInflater.rInflate(LayoutInflater.java:746) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
      at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:270) 
      at android.app.Activity.setContentView(Activity.java:1881) 
      at com.example.moviemanager.listMovieActivity.onCreate(listMovieActivity.java:20) 
      at android.app.Activity.performCreate(Activity.java:5104) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
            at android.app.ActivityThread.access$600(ActivityThread.java:141) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
            at android.os.Handler.dispatchMessage(Handler.java:99) 
            at android.os.Looper.loop(Looper.java:137) 
            at android.app.ActivityThread.main(ActivityThread.java:5041) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:511) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
            at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.NullPointerException 
      at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224) 
      at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) 
      at com.example.moviemanager.DatabaseHandler.open(DatabaseHandler.java:65) 
      at com.example.moviemanager.MovieListFragment.openDB(MovieListFragment.java:32) 
      at com.example.moviemanager.MovieListFragment.onCreateView(MovieListFragment.java:24) 
      at android.support.v4.app.Fragment.performCreateView(Fragment.java:1478) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:900) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1082) 
      at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1184) 
      at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:285) 
      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676) 
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:746) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
            at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:270) 
            at android.app.Activity.setContentView(Activity.java:1881) 
            at com.example.moviemanager.listMovieActivity.onCreate(listMovieActivity.java:20) 
            at android.app.Activity.performCreate(Activity.java:5104) 
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
            at android.app.ActivityThread.access$600(ActivityThread.java:141) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
            at android.os.Handler.dispatchMessage(Handler.java:99) 
            at android.os.Looper.loop(Looper.java:137) 
            at android.app.ActivityThread.main(ActivityThread.java:5041) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:511) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
            at dalvik.system.NativeStart.main(Native Method) 
04-03 13:31:02.795 6733-6733/com.example.moviemanager E/Trace﹕ error opening trace file: No such file or directory (2) 
+0

顯示總片段代碼 – 2015-04-03 13:07:23

+0

我已經添加了整個片段代碼@NoName – user3291870 2015-04-03 13:09:43

+0

嘗試使用Fragment代替!並在onCreateView方法中找到列表視圖。 – Harry 2015-04-03 13:12:41

回答

0

請嘗試以下方法:1。 默認情況下此listfragment包含列表視圖,因此不需要誇大觀點。

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

/** 
* Created by android on 3/4/15. 
*/ 
public class TestFragment extends ListFragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return super.onCreateView(inflater, container, savedInstanceState); 
    } 


    @Override 
    public void onStart() { 
     super.onStart(); 
     setListAdapter(//here pass t he adapter); 
    } 
} 
+0

它解決了嗎? – 2015-04-03 13:12:35

+0

如何將適配器傳遞給方法onStart()? – user3291870 2015-04-03 13:15:05

+0

調用此方法populateListViewFromDB();在onstart(); – 2015-04-03 13:16:04

0

你把數據ListFragment列表視圖與android.R.id.list,所以你必須使用setListAdapter(適配器),如之前的評論表示沒有名字。你也需要在XML來定義的:

<ListView android:id="@id/android:list" android:layout_width="match_parent" android:layout_height="match_parent"/>

編輯:覆蓋onViewCreated方法,並把那裏的DB查詢方法和適配器添加到ListFragment。

+0

其仍然相同。 – user3291870 2015-04-03 13:24:08

相關問題