Android - ListView in Fragment does not showing up

对着背影说爱祢 提交于 2019-12-24 00:27:23

问题


Here is my code that is having problems. I am trying to update my sqlite database data in ListView after entering an event, but the ListView is not showing, and I am bad in using fragment, can anyone guide me to what I am doing wrong here? Sorry I am new to android apps development. Thank you.

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

    View rootView = inflater.inflate(R.layout.event, container, false);
    show = (Button)rootView.findViewById(R.id.button1);
    show.setOnClickListener(this);
    return rootView;
}

public void onActivityCreated(int requestCode, int resultCode, Intent data) {
    ArrayList<HashMap<String, String>> eventList = controller
            .getAllEvents();
    if (eventList.size() != 0) {
        ListView lv = (ListView) rootView.findViewById(R.id.list);
        lv.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                eventId = (TextView) view.findViewById(R.id.eventId);
                String valEventId = eventId.getText().toString();
                Intent objIndent = new Intent(getActivity(),
                        EditEvent.class);
                objIndent.putExtra("eventId", valEventId);
                startActivity(objIndent);
            }
        });
        ListAdapter adapter = new SimpleAdapter(getActivity(), eventList,
                R.layout.view_event_entry, new String[] { "eventId",
                        "eventName" }, new int[] { R.id.eventId,
                        R.id.eventName });
        lv.setAdapter(adapter);
    }

}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    Intent objIntent = new Intent(getActivity(), AddEvent.class);
    startActivity(objIntent);
}

Here is my xml code:

<RelativeLayout
    android:id="@+id/relativeLayout1"
    android:layout_width="fill_parent"
    android:layout_height="40dp"
    android:orientation="vertical" >

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/addevents"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true" />

</RelativeLayout>
<RelativeLayout
    android:id="@id/relativeLayout1"
    android:layout_width="fill_parent"
    android:layout_height="match_parent"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/relativeLayout1"
    android:orientation="vertical"
    android:layout_marginTop="40dp">

<ListView
     android:id="@+id/list"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_alignParentLeft="true">
 </ListView>
 </RelativeLayout>
</RelativeLayout>

Here is the code for setting up my database. I wonder if this is where the problem happens. You guys can check it out here.

public EventController(Context applicationcontext) {
    super(applicationcontext, "androidsqlite.db", null, 1);
    Log.d(LOGCAT,"Created");
}

@Override
//create table for the database
public void onCreate(SQLiteDatabase database) {
    String query;
    query = "CREATE TABLE events ( eventId INTEGER PRIMARY KEY, eventName TEXT)";
    database.execSQL(query);    
    Log.d(LOGCAT,"events Created");
}

@Override
//drop the database and reset if required
public void onUpgrade(SQLiteDatabase database, int version_old, int current_version) {
    String query;
    query = "DROP TABLE IF EXISTS events";
    database.execSQL(query);
    onCreate(database);
}

public void insertEvent(HashMap<String, String> queryValues) {
    SQLiteDatabase database = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put("eventName", queryValues.get("eventName"));
    database.insert("events", null, values);
    database.close();
}

public int updateEvent(HashMap<String, String> queryValues) {
    SQLiteDatabase database = this.getWritableDatabase();    
    ContentValues values = new ContentValues();
    values.put("eventName", queryValues.get("eventName"));
    return database.update("events", values, "eventId" + " = ?", new String[] { queryValues.get("eventId") });
    //String updateQuery = "Update  words set txtWord='"+word+"' where txtWord='"+ oldWord +"'";
    //Log.d(LOGCAT,updateQuery);
    //database.rawQuery(updateQuery, null);
    //return database.update("words", values, "txtWord  = ?", new String[] { word });
}

public void deleteEvent(String id) {
    Log.d(LOGCAT,"delete");
    SQLiteDatabase database = this.getWritableDatabase();    
    String deleteQuery = "DELETE FROM  events where eventId='"+ id +"'";
    Log.d("query",deleteQuery);     
    database.execSQL(deleteQuery);
}

public ArrayList<HashMap<String, String>> getAllEvents() {
    ArrayList<HashMap<String, String>> wordList;
    wordList = new ArrayList<HashMap<String, String>>();
    String selectQuery = "SELECT  * FROM events";
    SQLiteDatabase database = this.getWritableDatabase();
    Cursor cursor = database.rawQuery(selectQuery, null);
    if (cursor.moveToFirst()) {
        do {
            HashMap<String, String> map = new HashMap<String, String>();
            map.put("eventId", cursor.getString(0));
            map.put("eventName", cursor.getString(1));
            wordList.add(map);
        } while (cursor.moveToNext());
    }

    // return contact list
    return wordList;
}

public HashMap<String, String> getEventInfo(String id) {
    HashMap<String, String> wordList = new HashMap<String, String>();
    SQLiteDatabase database = this.getReadableDatabase();
    String selectQuery = "SELECT * FROM events where eventId='"+id+"'";
    Cursor cursor = database.rawQuery(selectQuery, null);
    if (cursor.moveToFirst()) {
        do {
                //HashMap<String, String> map = new HashMap<String, String>();
            wordList.put("eventName", cursor.getString(1));
               //wordList.add(map);
        } while (cursor.moveToNext());
    }                   
return wordList;
}   

Here is the error I got:

10-26 08:02:29.141: E/AndroidRuntime(22646): FATAL EXCEPTION: main 10-26 08:02:29.141: E/AndroidRuntime(22646): java.lang.NullPointerException 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) 10-26 08:02:29.141: E/AndroidRuntime(22646): at com.example.hapshare.EventController.getAllEvents(EventController.java:70) 10-26 08:02:29.141: E/AndroidRuntime(22646): at com.example.hapshare.Event.onCreateView(Event.java:42) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1478) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.support.v4.view.ViewPager.populate(ViewPager.java:1068) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.support.v4.view.ViewPager.populate(ViewPager.java:914) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.view.View.measure(View.java:15696) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4851) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.view.View.measure(View.java:15696) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.widget.LinearLayout.measureVertical(LinearLayout.java:847) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.view.View.measure(View.java:15696) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4851) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 10-26 08:02:29.141: E/AndroidRuntime(22646): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2261) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.view.View.measure(View.java:15696) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2221) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1287) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1524) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1187) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4855) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:766) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.view.Choreographer.doCallbacks(Choreographer.java:575) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.view.Choreographer.doFrame(Choreographer.java:542) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:751) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.os.Handler.handleCallback(Handler.java:725) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.os.Handler.dispatchMessage(Handler.java:92) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.os.Looper.loop(Looper.java:158) 10-26 08:02:29.141: E/AndroidRuntime(22646): at android.app.ActivityThread.main(ActivityThread.java:5777) 10-26 08:02:29.141: E/AndroidRuntime(22646): at java.lang.reflect.Method.invokeNative(Native Method) 10-26 08:02:29.141: E/AndroidRuntime(22646): at java.lang.reflect.Method.invoke(Method.java:511) 10-26 08:02:29.141: E/AndroidRuntime(22646): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1083) 10-26 08:02:29.141: E/AndroidRuntime(22646): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:850) 10-26 08:02:29.141: E/AndroidRuntime(22646): at dalvik.system.NativeStart.main(Native Method)


回答1:


There are a few things that raise red flags in your code. Which leads me to my first question: are you using eclipse or intellij? Because it doesn't look like it'll even compile to me. Maybe you edited this on here, but now to help you get it working. Don't even use onActivityCreated for initializing your ListView in a Fragment (Andrew also correctly brought up the point that you aren't even using it correctly, which is why I am surprised its even compiling if it is). You should be doing it in onCreateView. Now I will post your code that I have edited. I am not testing it so it serves as a better guide to what it should look like (and hopefully it compiles).

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

    View rootView = inflater.inflate(R.layout.event, container, false);

    ArrayList<HashMap<String, String>> eventList = controller
            .getAllEvents();
    if (eventList.size() != 0) {
        ListView lv = (ListView) rootView.findViewById(R.id.list);
        lv.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                eventId = (TextView) view.findViewById(R.id.eventId);
                String valEventId = eventId.getText().toString();
                Intent objIndent = new Intent(getActivity(),
                        EditEvent.class);
                objIndent.putExtra("eventId", valEventId);
                startActivity(objIndent);
            }
        });
        ListAdapter adapter = new SimpleAdapter(getActivity(), eventList,
                R.layout.view_event_entry, new String[] { "eventId",
                        "eventName" }, new int[] { R.id.eventId,
                        R.id.eventName });
        lv.setAdapter(adapter);
    }
    show = (Button)rootView.findViewById(R.id.button1);
    show.setOnClickListener(this);

    return rootView;
}
...



回答2:


There are a few things wrong with this. First off, you overrode onActivityCreated() incorrectly. Instead of what you have, it should have the following header:

public void onActivityCreated(Bundle savedInstanceStates)

Because you use the wrong header, it is never called.

Secondly, you may get some errors from using rootView in your onActivityCreated() method because it is not declared in that method. Consider calling getView() instead, as that returns the rootView for you.



来源:https://stackoverflow.com/questions/19594037/android-listview-in-fragment-does-not-showing-up

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!