2016-04-26 52 views
0

我創建了一半的應用程序,我被卡在需要從SQLite數據庫檢索數據並將它們顯示在TabFragment內的ListView中的位置。
我有兩個選項卡,其中一個將顯示來自SQLite數據庫的數據列表。在片段內的ListView中的SQLite數據

有些人在stackoverflow建議使用RecyclerView而不是一個ListView,但我很難使用ListView和我對RecyclerView一無所知。
我是Android新手,我覺得這些問題對於專業開發人員來說並不困難,但對我來說這是相當具有挑戰性的。

我能夠顯示數據庫中的數據在一個片段,但我能夠顯示只有一行是最新的條目。
我想顯示從碎片中的整個列表從最新到舊,從上到下。

問題的另一部分是該列表不會自動更新。
我需要關閉應用程序並重新打開它才能看到片段中的最新條目。

這裏是我的代碼 -

PeopleFragemnt.class以前

import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

import com.example.kevin.sugar.DataBase.DateBaseHelper; 
import com.example.kevin.sugar.DataBase.Information; 
import com.example.kevin.sugar.R; 

/** 
* A simple {@link Fragment} subclass. 
*/ 
public class PeopleFragment extends Fragment { 

    DateBaseHelper dateBaseHelper; 
    SQLiteDatabase sqLiteDatabase; 
    Cursor cursor; 

    TextView name,weight,height; 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View mview = inflater.inflate(R.layout.person_row, container, false); 

     name = (TextView)mview.findViewById(R.id.person_name); 
     weight = (TextView)mview.findViewById(R.id.heatbeat); 
     height = (TextView)mview.findViewById(R.id.bpm_upper_lower); 

     dateBaseHelper = new DateBaseHelper(getContext()); 
     sqLiteDatabase = dateBaseHelper.getReadableDatabase(); 
     cursor = dateBaseHelper.getUserInformation(); 
     if (cursor.moveToFirst()){ 
      do{ 
       String user_name,user_weight,user_height; 
       user_name = cursor.getString(cursor.getColumnIndex(Information.NAME)); 
       user_weight = cursor.getString(cursor.getColumnIndex(Information.WEIGHT)); 
       user_height = cursor.getString(cursor.getColumnIndex(Information.HEIGHT)); 

       Log.e("App",user_name+ "" + user_height + " " +user_weight); 
       name.setText(user_name); 
       weight.setText(user_weight); 
       height.setText(user_height); 

      }while (cursor.moveToNext()); 
     } 

     return mview; 
    } 

} 

編輯

變化在PeopleFragement.class

import android.content.Context; 


import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.TextView; 

import com.example.kevin.sugar.R; 

import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by Kuro on 4/20/2016. 
*/ 
public class ListDataAdapter extends ArrayAdapter { 

    List mlist = new ArrayList(); 

    public ListDataAdapter(Context context, int resource) { 
     super(context, resource); 
    } 

    @Override 
    public void add(Object object) { 
     super.add(object); 
     mlist.add(object); 

    } 

    static class LayoutHandler{ 
     TextView name, weight,height; 
    } 

    @Override 
    public int getCount() { 
     return mlist.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return mlist.get(position); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View mview = convertView; 
     LayoutHandler layoutHandler; 
     if(mview==null){ 
      LayoutInflater layoutInflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      mview = layoutInflater.inflate(R.layout.person_row,parent,false); 
      layoutHandler = new LayoutHandler(); 
      layoutHandler.name = (TextView)mview.findViewById(R.id.person_name); 
      layoutHandler.weight = (TextView)mview.findViewById(R.id.heatbeat); 
      layoutHandler.height = (TextView)mview.findViewById(R.id.bpm_upper_lower); 

      mview.setTag(layoutHandler); 
     }else { 
      layoutHandler = (LayoutHandler) mview.getTag(); 
     } 
     DataProvider dataProvider = (DataProvider)this.getItem(position); 
     layoutHandler.name.setText(dataProvider.getName()); 
     layoutHandler.weight.setText(dataProvider.getWeight()); 
     layoutHandler.height.setText(dataProvider.getHeight()); 
     return mview; 
    } 
} 

ListDataAdapter.Class

import android.content.Context; 


import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.TextView; 

import com.example.kevin.sugar.R; 

import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by Kuro on 4/20/2016. 
*/ 
public class ListDataAdapter extends ArrayAdapter { 

    List mlist = new ArrayList(); 

    public ListDataAdapter(Context context, int resource) { 
     super(context, resource); 
    } 

    @Override 
    public void add(Object object) { 
     super.add(object); 
     mlist.add(object); 

    } 

    static class LayoutHandler{ 
     TextView name, weight,height; 
    } 

    @Override 
    public int getCount() { 
     return mlist.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return mlist.get(position); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View mview = convertView; 
     LayoutHandler layoutHandler; 
     if(mview==null){ 
      LayoutInflater layoutInflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      mview = layoutInflater.inflate(R.layout.person_row,parent,false); 
      layoutHandler = new LayoutHandler(); 
      layoutHandler.name = (TextView)mview.findViewById(R.id.person_name); 
      layoutHandler.weight = (TextView)mview.findViewById(R.id.heatbeat); 
      layoutHandler.height = (TextView)mview.findViewById(R.id.bpm_upper_lower); 

      mview.setTag(layoutHandler); 
     }else { 
      layoutHandler = (LayoutHandler) mview.getTag(); 
     } 
     DataProvider dataProvider = (DataProvider)this.getItem(position); 
     layoutHandler.name.setText(dataProvider.getName()); 
     layoutHandler.weight.setText(dataProvider.getWeight()); 
     layoutHandler.height.setText(dataProvider.getHeight()); 
     return mview; 
    } 
} 

DataProvide.class

public class DataProvider { 

    private String name; 
    private String weight; 
    private String height; 

    public DataProvider(String name,String weight,String height){ 
     this.name = name; 
     this.weight = weight; 
     this.height = height; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getWeight() { 
     return weight; 
    } 

    public void setWeight(String weight) { 
     this.weight = weight; 
    } 

    public String getHeight() { 
     return height; 
    } 

    public void setHeight(String height) { 
     this.height = height; 
    } 
} 

錯誤日誌

FATAL EXCEPTION: main 
                       Process: com.example.kevin.sugar, PID: 29352 
                       java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference 
                        at com.example.kevin.sugar.Fragments.PeopleFragment.onCreateView(PeopleFragment.java:40) 
                        at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962) 
                        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) 
                        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248) 
                        at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738) 
                        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613) 
                        at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570) 
                        at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) 
                        at android.support.v4.view.ViewPager.populate(ViewPager.java:1106) 
                        at android.support.v4.view.ViewPager.populate(ViewPager.java:952) 
                        at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1474) 
                        at android.view.View.measure(View.java:17565) 
                        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537) 
                        at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:610) 
                        at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:677) 
                        at android.view.View.measure(View.java:17565) 
                        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537) 
                        at android.widget.FrameLayout.onMeasure(FrameLayout.java:436) 
                        at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135) 
                        at android.view.View.measure(View.java:17565) 
                        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537) 
                        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) 
                        at android.widget.LinearLayout.measureVertical(LinearLayout.java:722) 
                        at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) 
                        at android.view.View.measure(View.java:17565) 
                        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537) 
                        at android.widget.FrameLayout.onMeasure(FrameLayout.java:436) 
                        at android.view.View.measure(View.java:17565) 
                        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537) 
                        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) 
                        at android.widget.LinearLayout.measureVertical(LinearLayout.java:722) 
                        at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) 
                        at android.view.View.measure(View.java:17565) 
                        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5537) 
                        at android.widget.FrameLayout.onMeasure(FrameLayout.java:436) 
                        at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2615) 
                        at android.view.View.measure(View.java:17565) 
                        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2045) 
                        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1196) 
                        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1409) 
                        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1084) 
                        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5990) 
                        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 
                        at android.view.Choreographer.doCallbacks(Choreographer.java:580) 
                        at android.view.Choreographer.doFrame(Choreographer.java:550) 
                        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 
                        at android.os.Handler.handleCallback(Handler.java:739) 
                        at android.os.Handler.dispatchMessage(Handler.java:95) 
                        at android.os.Looper.loop(Looper.java:135) 
                        at android.app.ActivityThread.main(ActivityThread.java:5343) 
                        at java.lang.reflect.Method.invoke(Native Method) 
                        at java.lang.reflect.Method.invoke(Method.java:372) 
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700) 
+0

你給你的3個TextViews行中的所有值。最後一個仍然存在,因爲循環結束。這不是如何使用ListView:您必須填充適配器,然後將適配器傳遞給ListView。您應該搜索關於'Android中的數據庫填充的ListView中的自定義行「的教程。 –

+0

感謝您的回覆。你能解釋適配器部分嗎?我沒有明白。 – Greyfrog

+1

用適配器創建ArrayList然後工作完美。 –

回答

3

根據堆棧跟蹤,你的listview不能被JVM找到,所以它拋出了空指針異常。這裏是你必須使用的代碼片段才能在listview中顯示數據。

PeopleFragment.java

public class PeopleFragment extends Fragment { 

private DateBaseHelper dateBaseHelper; 
private SQLiteDatabase sqLiteDatabase; 
private List<DataProvider> mPersonList; 
private ListDataAdapter mListDataAdapter; 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View mview = inflater.inflate(R.layout.fragment_person, container, false); 

    ListView listView = (ListView) mview.findViewById(R.id.lv_person); 
    mPersonList = new ArrayList<>(); 
    dateBaseHelper = new DateBaseHelper(getContext()); 
    sqLiteDatabase = dateBaseHelper.getReadableDatabase(); 
    Cursor cursor = dateBaseHelper.getUserInformation(); 
    if (cursor.moveToFirst()){ 
     do{ 
      String user_name,user_weight,user_height; 
      user_name = cursor.getString(cursor.getColumnIndex(Information.NAME)); 
      user_weight = cursor.getString(cursor.getColumnIndex(Information.WEIGHT)); 
      user_height = cursor.getString(cursor.getColumnIndex(Information.HEIGHT)); 
      DataProvider dataProvider = new DataProvider(user_name,user_weight,user_height); 
      mPersonList.add(dataProvider); 
     }while (cursor.moveToNext()); 
    } 

    mListDataAdapter = new ListDataAdapter(getContext(),R.layout.row_person,mPersonList); 
    listView.setAdapter(mListDataAdapter); 
    return mview; 
    } 
} 

fragment_person.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

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

</LinearLayout> 

您DataProvider.java

public class DataProvider { 

private String name; 
private String weight; 
private String height; 

public DataProvider(String name,String weight,String height){ 
    this.name = name; 
    this.weight = weight; 
    this.height = height; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getWeight() { 
    return weight; 
} 

public void setWeight(String weight) { 
    this.weight = weight; 
} 

public String getHeight() { 
    return height; 
} 

public void setHeight(String height) { 
    this.height = height; 
    } 
} 

ListDataAdapter.java

public class ListDataAdapter extends ArrayAdapter { 

List<DataProvider> mlist; 

public ListDataAdapter(Context context, int resource,List<DataProvider> list) 
{ 
    super(context, resource); 
    mlist = list; 
} 

static class LayoutHandler{ 
    TextView name, weight,height; 
} 

@Override 
public int getCount() { 
    return mlist.size(); 
} 

@Override 
public Object getItem(int position) { 
    return mlist.get(position); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View mview = convertView; 
    LayoutHandler layoutHandler; 
    if(mview==null){ 
     LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     mview = layoutInflater.inflate(R.layout.row_person,parent,false); 
     layoutHandler = new LayoutHandler(); 
     layoutHandler.name = (TextView)mview.findViewById(R.id.tv_name); 
     layoutHandler.weight = (TextView)mview.findViewById(R.id.tv_weight); 
     layoutHandler.height = (TextView)mview.findViewById(R.id.tv_height); 

     mview.setTag(layoutHandler); 
    }else { 
     layoutHandler = (LayoutHandler) mview.getTag(); 
    } 
    DataProvider dataProvider = (DataProvider)this.getItem(position); 
    layoutHandler.name.setText(dataProvider.getName()); 
    layoutHandler.weight.setText(dataProvider.getWeight()); 
    layoutHandler.height.setText(dataProvider.getHeight()); 
    return mview; 
    } 
} 

row_person。XML

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
> 

<TextView 
    android:id="@+id/tv_name" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    /> 
<TextView 
    android:id="@+id/tv_weight" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    /> 
<TextView 
    android:id="@+id/tv_height" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    /> 
</LinearLayout> 

更新不需要重新打開應用程序的數據只需要與新的數據集來通知您的適配器。假設你的光標數據已經改變,並且你在同一頁面上。所以只需清除personList中的舊數據並添加新數據即可。這裏是代碼

public void updatePersonList(){ 
    mPersonList.clear(); 
    dateBaseHelper = new DateBaseHelper(getContext()); 
    sqLiteDatabase = dateBaseHelper.getReadableDatabase(); 
    cursor = dateBaseHelper.getUserInformation(); 
    if (cursor.moveToFirst()){ 
     do{ 
      String user_name,user_weight,user_height; 
      user_name = cursor.getString(cursor.getColumnIndex(Information.NAME)); 
      user_weight = cursor.getString(cursor.getColumnIndex(Information.WEIGHT)); 
      user_height = cursor.getString(cursor.getColumnIndex(Information.HEIGHT)); 

      DataProvider dataProvider = new DataProvider(user_name,user_weight,user_height); 
      mPersonList.add(dataProvider); 
     }while (cursor.moveToNext()); 
    } 
    mListDataAdapter.notifyDataSetChanged(); 
} 
+0

是的,昨天我解決了這個問題。我已經回覆鮑勃Malooga。無論如何感謝回覆:)。我會將其標記爲已答覆。 – Greyfrog

+0

你能告訴我在哪裏調用** updatepersonList **方法嗎? – Greyfrog

+0

每當你的數據被改變,你在同一個頁面,即PersonFragment.java。德一個例子我有一個對話框在數據庫中添加新的人細節相同的片段。現在在數據庫中添加數據後,我們關閉了我們的對話框,但添加的人不會反映在列表中。所以一旦我們放棄了我們稱之爲updatePersonList()的對話方式,它會在旅途中顯示新的人物細節。我希望我能夠讓你明白。 –