Java Listview不是';t在片段中更新

Java Listview不是';t在片段中更新,java,android,listview,android-fragments,android-lifecycle,Java,Android,Listview,Android Fragments,Android Lifecycle,我确信updateFromDatabase()函数可以工作,我使用print语句查看放入mcoordinateArray的条目是否存在,而不是空字符串。但是,当我重新启动应用程序时,该片段从未使用数据库中的项目填充列表视图。我认为这与片段生命周期有关,但我不知道 此外,当我没有重新启动应用程序并第一次运行它时,列表视图运行正常。当我旋转或重新启动应用程序时,列表视图不再填充 public class LocalFragment extends Fragment{ private ListVie

我确信
updateFromDatabase()
函数可以工作,我使用print语句查看放入
mcoordinateArray
的条目是否存在,而不是空字符串。但是,当我重新启动应用程序时,该片段从未使用数据库中的项目填充列表视图。我认为这与片段生命周期有关,但我不知道

此外,当我没有重新启动应用程序并第一次运行它时,列表视图运行正常。当我旋转或重新启动应用程序时,列表视图不再填充

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类LocalFragment扩展了片段{
私有ListView-mLocalList;
专用阵列适配器;
私人阵列列表mCoordinatesArray;
专用广播接收机;
私有LocationBaseHelperMDatabase;
专用日期格式;
私有字符串日期字符串;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图v=充气机。充气(右布局。局部碎片,容器,错误);
//SQLite设置
mDatabase=newlocationbasehelper(getActivity());
mLocalList=(ListView)v.findViewById(R.id.lv_local);
mcoordinateArray=newArrayList();
adapter=new ArrayAdapter(getActivity(),android.R.layout.simple_list_item_1,mcoordinateArray);
如果(!mDatabase.size()等于(“0”)){
updateFromDatabase();
}
mLocalList.setAdapter(适配器);
返回v;
}
@凌驾
恢复时公开作废(){
super.onResume();
if(mBroadcastReceiver==null){
mBroadcastReceiver=新广播接收器(){
@凌驾
公共void onReceive(上下文、意图){
日期格式=新的简化格式(“MM/dd HH:MM:ss a”);
dateString=dateFormat.format(新日期());
String[]data=intent.getStringExtra(“坐标”).split(“”);
mDatabase.insertEntry(日期字符串,数据[0],数据[1]);
System.out.println(mDatabase.size());
mcoordinateArray.add(日期字符串+“”+数据[0]+“”+数据[1]);
adapter.notifyDataSetChanged();
}
};
}
getActivity().registerReceiver(mBroadcastReceiver,新的意图过滤器(“位置更新”);
}
@凌驾
公共空间{
super.ondestory();
如果(mBroadcastReceiver!=null){
getActivity().unregisterReceiver(mBroadcastReceiver);
}
}
//此方法可用于从本地数据库更新阵列坐标
私有void updateFromDatabase(){
//mcoordinateArray.clear();
mcoordinateArray=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);
}
}
public类LocationBaseHelper扩展了SQLiteOpenHelper{
私有静态最终int版本=1;
私有静态最终字符串D​A.​T​A.​B​A.​s​E​_​N​A.​M​E​ = “locationBase.db”;
公共位置BaseHelper(上下文){
超级(上下文,D)​A.​T​A.​B​A.​s​E​_​N​A.​M​E​, 空,版本);
}
@凌驾
public void onCreate(SQLiteDatabase db){
db.execSQL(“创建表”+LocationTable.NAME+”(“+
LocationTable.Cols.DATE\u TIME+“文本,”+
LocationTable.Cols.LATITUDE+“文本,”+
LocationTable.Cols.LONGITUDE+“文本)”
);
}
@凌驾
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
}
public void insertEntry(字符串日期\时间、字符串纬度、字符串经度){
SQLiteDatabase db=this.getWritableDatabase();
ContentValues content=新ContentValues();
content.put(LocationTable.Cols.DATE\u TIME,DATE\u TIME);
content.put(LocationTable.Cols.纬度、纬度);
content.put(LocationTable.Cols.LONGITUDE,LONGITUDE);
db.insert(LocationTable.NAME,null,content);
}
公共ArrayList getEntireDatabase(){
SQLiteDatabase db=this.getReadableDatabase();
Cursor Cursor=db.rawQuery(“SELECT*FROM”+LocationTable.NAME,null);
cursor.moveToFirst();
ArrayList值=新的ArrayList();
做{
字符串值=(字符串)cursor.getString(cursor.getColumnIndex(LocationTable.Cols.DATE\u TIME))+“”+
(字符串)cursor.getString(cursor.getColumnIndex(LocationTable.Cols.LATITUDE))+“”+
(String)cursor.getString(cursor.getColumnIndex(LocationTable.Cols.LONGITUDE));
值。添加(0,值);
}while(cursor.moveToNext());
返回值;
}
公共字符串大小(){
SQLiteDatabase db=this.getReadableDatabase();
Cursor Cursor=db.rawQuery(“从“+LocationTable.NAME,null)”中选择COUNT(*);
cursor.moveToFirst();
返回cursor.getString(0);
}
}

尝试重新创建ArrayAdapter,而不是使用.notifyDataSetChanged():

//更新数据
mcoordinateArray=mDatabase.getEntireDatabase();
//使用新更新的阵列创建新适配器
adapter=new ArrayAdapter(getActivity(),android.R.layout.simple_list_item_1,mcoordinateArray);
//为listview设置适配器
mLocalList.setAdapter(适配器);

您可以将此方法放入片段中,并从附加到片段的活动调用

public void updateList(List<?> result) {

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

    gridMediaListAdapter.notifyDataSetChanged();
}
public void updateList(列表结果){
如果(multimediaListRent.size()>0){
setAdapter(gridMediaListAdapter);
multimediaListRent.clear();
}
gridMediaListAdapter.notifyDataSetChanged();
}

通过调用
mcoordinateArray=mDatabase.getEntireDatabase()
您正在更改
mcoordinateArray
的引用,而适配器仍保留旧引用,因此它看不到任何更改

而不是创建
mcoordinate的新实例
public void updateList(List<?> result) {

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

    gridMediaListAdapter.notifyDataSetChanged();
}
mCoordinateArray.clear();
mCoordinateArray.addAll(mDatabase.getData());
adapter.notifyDataSetChange();