使用ListFragment从数据库中获取项目

时间:2015-04-03 13:05:47

标签: java android android-listfragment

我遇到了一个问题,我无法在listfragment中显示数据库中的数据。目前我正在使用SimpleCursorAdapter来显示我的数据,但是当我点击我的按钮时它没有数据。

这是我的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)

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:0)

您将使用android.R.id.list将数据放入ListFragment listview中,因此您必须使用setListAdapter(adapter),如上一条注释中所示No Name。你还必须在xml中定义它:

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

编辑:覆盖onViewCreated方法并将数据库查询方法放在那里并将适配器添加到ListFragment。