2016-04-26 9 views
0

Ich habe die Hälfte meiner App erstellt und ich bin fest, wo ich die Daten aus der SQLite-Datenbank abrufen und in einem ListView in einem Tab-Fragment anzeigen müssen.
Ich habe zwei Registerkarten und einer von ihnen zeigt die Liste der Daten aus der SQLite-Datenbank.SQLite-Daten in einem ListView in einem Fragment

Einige Leute auf Stackoverflow haben vorgeschlagen, eine RecyclerView anstelle einer ListView zu verwenden, aber es ist schwierig für mich, eine ListView zu verwenden, und ich weiß nichts über die RecyclerView.
Ich bin neu in Android und ich fühle, dass diese Probleme nicht so schwierig für professionelle Entwickler sind, aber für mich ist es ziemlich schwierig.

Ich bin in der Lage, die Daten aus der Datenbank in einem Fragment anzuzeigen, aber ich kann nur eine Zeile anzeigen, die der neueste Eintrag ist.
Ich möchte die gesamte Liste im Fragment von neuesten zu alten, von oben nach unten anzeigen.

Der andere Teil des Problems ist, dass die Liste nicht automatisch aktualisiert wird.
Ich muss die App schließen und erneut öffnen, um den neuesten Eintrag im Fragment zu sehen.

Hier ist mein Code -

PeopleFragemnt.classVor

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; 
    } 

} 

bearbeiten

Veränderung der PeopleFragement.class

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; 
    } 
} 

Error Log

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

Sie geben Ihre 3 TextViews alle Werte in der Zeile. Und die letzte bleibt, da die Schleife endet. So arbeiten Sie nicht mit einer ListView: Sie müssen einen Adapter füllen und den Adapter dann an die ListView übergeben. Sie sollten nach einem Tutorial zu 'benutzerdefinierten Zeilen in einem ListView suchen, das aus einer Datenbank in Android gefüllt ist. –

+0

Danke für die Antwort. Kannst du das Adapterteil erklären? Ich habe es nicht verstanden. – Greyfrog

+1

Create ArrayList mit Adapter dann funktioniert perfekt. –

Antwort

3

Wie bei der Stack-Trace wird Ihre Listview von JVM nicht gefunden, daher gibt es eine Nullpointer-Ausnahme. Hier ist das Code-Snippet, das Sie verwenden müssen, um Daten in der Listenansicht anzuzeigen.

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> 

Ihre 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> 

die Daten, die Sie die Anwendung wieder zu öffnen, brauchen nicht zu aktualisieren, müssen nur Ihren Adapter mit neuen Satz von Daten informieren. Angenommen, Ihre Cursordaten haben sich geändert und Sie befinden sich auf derselben Seite. Sie müssen also nur alte Daten von personList löschen und neue Daten hinzufügen. Hier ist der Code

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

Ja, gestern habe ich das Problem gelöst. Und ich habe Bob Malooga geantwortet. Danke für die Antwort :) wie auch immer. Ich werde es als Antwort markieren. – Greyfrog

+0

Können Sie mir sagen, wo ich die ** updatepersonList ** Methode aufrufen soll? – Greyfrog

+0

Immer wenn Ihre Daten geändert werden und Sie sich auf derselben Seite befinden, zB PersonFragment.java. Tak ein Beispiel Ich habe einen Dialog auf demselben Fragment, der neue Personendetails in Datenbank hinzufügt. Jetzt, nachdem wir die Daten in der Datenbank hinzugefügt haben, schließen wir unseren Dialog ab, aber die hinzugefügte Person spiegelt die Liste nicht wieder. Sobald wir den Dialog geschlossen haben, rufen wir updatePersonList() methood auf und es wird die neue Personendetails unterwegs angezeigt. Ich hoffe, ich kann dich verstehen lassen. –