2016-11-10 16 views
2

updateFromDatabase()関数が正しく機能することを知っています。print文を使用して、mCoordinatesArrayに入れられたエントリがそこにあり、空の文字列ではないことを確認しました。しかし、私は、アプリケーションを再起動すると、フラグメントは決してデータベース内の項目でリストビューを作成します。私は断片ライフサイクルと関係があると思いますが、私には分かりません。リストビューがフラグメント内で更新されていない

さらに、私がアプリを再起動して初めて実行すると、リストビューは正常に動作します。アプリを回転または再起動すると、リストビューに表示されなくなりました。

public class LocalFragment extends Fragment{ 

private ListView mLocalList; 
private ArrayAdapter<String> adapter; 
private ArrayList<String> mCoordinatesArray; 
private BroadcastReceiver mBroadcastReceiver; 
private LocationBaseHelper mDatabase; 
private DateFormat dateFormat; 
private String dateString; 

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
    View v = inflater.inflate(R.layout.fragment_local,container,false); 
    // SQLite Setup 
    mDatabase = new LocationBaseHelper(getActivity()); 

    mLocalList = (ListView) v.findViewById(R.id.lv_local); 
    mCoordinatesArray = new ArrayList<>(); 
    adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, mCoordinatesArray); 
    if(!mDatabase.size().equals("0")){ 
     updateFromDatabase(); 
    } 
    mLocalList.setAdapter(adapter); 
    return v; 
} 

@Override 
public void onResume() { 
    super.onResume(); 

    if(mBroadcastReceiver == null){ 
     mBroadcastReceiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       dateFormat = new SimpleDateFormat("MM/dd HH:mm:ss a"); 
       dateString = dateFormat.format(new Date()); 

       String[] data = intent.getStringExtra("coordinates").split(" "); 
       mDatabase.insertEntry(dateString,data[0],data[1]); 
       System.out.println(mDatabase.size()); 

       mCoordinatesArray.add(dateString + " " + data[0] + " " + data[1]); 
       adapter.notifyDataSetChanged(); 
      } 
     }; 
    } 
    getActivity().registerReceiver(mBroadcastReceiver, new IntentFilter("location_update")); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    if(mBroadcastReceiver!=null){ 
     getActivity().unregisterReceiver(mBroadcastReceiver); 
    } 
} 

// THIS METHOD CAN BE USED TO UPDATE THE ARRAY HOLDING COORDINATES FROM THE LOCAL DATABASE 
private void updateFromDatabase(){ 
    //mCoordinatesArray.clear(); 
    mCoordinatesArray = mDatabase.getEntireDatabase(); 
    adapter.notifyDataSetChanged(); 
} 

} 

ここで私のヘルパークラスですが、問題はここにあります。

public class LocationBaseHelper extends SQLiteOpenHelper { 

private static final int VERSION = 1; 
private static final String D​A​T​A​B​A​S​E​_​N​A​M​E​ = "locationBase.db"; 

public LocationBaseHelper(Context context) { 
    super(context, D​A​T​A​B​A​S​E​_​N​A​M​E​, null, VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL("create table " + LocationTable.NAME    + " ("  + 
            LocationTable.Cols.DATE_TIME + " text, " + 
            LocationTable.Cols.LATITUDE  + " text, " + 
            LocationTable.Cols.LONGITUDE + " text)" 
    ); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

} 

public void insertEntry(String date_time, String latitude, String longitude){ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues content = new ContentValues(); 
    content.put(LocationTable.Cols.DATE_TIME,date_time); 
    content.put(LocationTable.Cols.LATITUDE,latitude); 
    content.put(LocationTable.Cols.LONGITUDE,longitude); 
    db.insert(LocationTable.NAME,null,content); 
} 

public ArrayList<String> getEntireDatabase(){ 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.rawQuery("SELECT * FROM " + LocationTable.NAME,null); 
    cursor.moveToFirst(); 

    ArrayList<String> values = new ArrayList<>(); 

    do{ 
     String value = (String) cursor.getString(cursor.getColumnIndex(LocationTable.Cols.DATE_TIME)) + " " + 
         (String) cursor.getString(cursor.getColumnIndex(LocationTable.Cols.LATITUDE)) + " " + 
         (String) cursor.getString(cursor.getColumnIndex(LocationTable.Cols.LONGITUDE)); 
     values.add(0,value); 

    }while(cursor.moveToNext()); 

    return values; 
} 

public String size(){ 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.rawQuery("SELECT COUNT(*) FROM " + LocationTable.NAME,null); 
    cursor.moveToFirst(); 
    return cursor.getString(0); 
} 
} 
+0

LocationBaseHelperクラスを表示できますか? –

+0

さて、でも、うまくいきます。それは私が確信しているリストビューとは関係があります。 – Developer

+0

フラグメントのonActivityCreated()関数でUI以外のロジックを移動しようとすると、onCreateView()の後に呼び出され、そのアクティビティが通信できる状態になっていることを確認します。 – Farhan

答えて

1

代わりmCoordinateArrayの新しいインスタンスを作成するのではなく、あなたがいうだけで、それが含まれている値を更新する必要があり、のようなもの:

mCoordinateArray.clear(); 
mCoordinateArray.addAll(mDatabase.getData()); 
adapter.notifyDataSetChange(); 

あなたの代わりに、完全に新しいセットを作成する、アダプターによって参照されるデータを変更しているその方法アダプターが認識していないデータの数。

+0

omg私はあなたを愛していますそれを台無しにした – Developer

1

代わり.notifyDataSetChanged()を使用してのごArrayAdapterを再作成してください:

// update Data 
mCoordinatesArray = mDatabase.getEntireDatabase(); 
// create new adapter with new updated array 
adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, mCoordinatesArray); 
// set adapter for the listview 
mLocalList.setAdapter(adapter); 
0

あなたのフラグメントで、この方法を入れて、フラグメントに添付アクティビティから呼び出すことができます。あなたがmCoordinatesArrayの参照を変更している、そしてそれはすべての変更を見ていないので、アダプタはまだ、古い参照を保持しているmCoordinatesArray = mDatabase.getEntireDatabase();呼び出すことによって

public void updateList(List<?> result) { 

    if (multimediaListRent.size()>0) { 
     multimediaGridView.setAdapter(gridMediaListAdapter); 
     multimediaListRent.clear(); 
    } 

    gridMediaListAdapter.notifyDataSetChanged(); 
} 
関連する問題