Java Android ListView在数据集更改后不刷新,尽管我使用了适配器。notifyDataSetChanged()
我知道类似的问题在这里已经被问过好几次了,但是没有一个能帮助我解决问题,所以我只能再问一次 我有一个应用程序,它有一个片段,在主活动中保存一个ListView,我使用了一个PullableListView,这样当我向上拖动ListView时,它将触发onLoadMore()回调方法从服务器加载更多数据。加载数据后,数据将保存到SQLiteDB,然后由ListView用于显示更新的数据 这是我的PullableListViewFragment.java:Java Android ListView在数据集更改后不刷新,尽管我使用了适配器。notifyDataSetChanged(),java,android,sqlite,android-listview,Java,Android,Sqlite,Android Listview,我知道类似的问题在这里已经被问过好几次了,但是没有一个能帮助我解决问题,所以我只能再问一次 我有一个应用程序,它有一个片段,在主活动中保存一个ListView,我使用了一个PullableListView,这样当我向上拖动ListView时,它将触发onLoadMore()回调方法从服务器加载更多数据。加载数据后,数据将保存到SQLiteDB,然后由ListView用于显示更新的数据 这是我的PullableListViewFragment.java: public class Pullable
public class PullableListViewFragment extends Fragment implements
OnItemClickListener {
private ListView listView;
private PullToRefreshLayout ptrl;
private MissionDB mMissionDB;
private List<MissionEntity> mData;
private MissionListAdapter mAdapter;
/**
* Specify the exact mission that will be displayed in MissionDetailActivity
*/
private int mIndexOfMission;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View pullableLayout = inflater.inflate(R.layout.pullable_layout, container, false);
listView = (ListView) pullableLayout.findViewById(R.id.content_view);
listView.setDivider(null);
ptrl = (PullToRefreshLayout) pullableLayout.findViewById(R.id.refresh_view);
ptrl.setOnRefreshListener(new RefreshListener());
loadData();
Log.d(Constants.LOG_TAG, "onCreateView Called from PullableListViewFragment");
return pullableLayout;
}
/**
* Initialise ListView
*/
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mAdapter = new MissionListAdapter(getActivity(), mData);
listView.setAdapter(mAdapter);
listView.setOnItemClickListener(this);
mAdapter.notifyDataSetChanged();
Log.d(Constants.LOG_TAG, "onActivityCreated Called from PullableListViewFragment");
}
/**
* Load data from db
*/
private void loadData() {
mData = new ArrayList<>();
mMissionDB = MissionDB.getInstance(MyApplication.getContext());
mData = mMissionDB.loadMission();
}
/**
* OnItemClick event
*/
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Intent intent = new Intent(getActivity(), MissionDetailActivity.class);
mIndexOfMission = mData.get((int) id).getId();
intent.putExtra("Position", mIndexOfMission);
startActivity(intent);
}
}
这是片段的layout.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f2f2f2"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="5dp" />
<pulltorefresh.PullToRefreshLayout
android:id="@+id/refresh_view"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/refresh_head"/>
<!-- Supports all view that implemented the Pullable interface -->
<pulltorefresh.PullableListView
android:id="@+id/content_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<include layout="@layout/load_more"/>
</pulltorefresh.PullToRefreshLayout>
</LinearLayout>
问题是,当在onLoadMore()方法之后更改SQLiteDB中的数据时,片段中的ListView不会自动刷新,除非我导航到同一主活动中的另一个片段,然后再导航回来
我在这里找到的所有方法都累坏了,但都没用
谁能告诉我,当SQLiteDB中的数据发生更改时,如何使ListView自身刷新
[Update 1]我在onLoadMore()回调中添加了一些代码,从服务器获取一些数据后,数据的大小保持不变,我认为这就是为什么ListVie没有刷新的问题,有趣的是如果我在
commission.loadMission()之前放置线程.sleep(500)
数据大小正确,一切正常。知道为什么吗?在onLoadMore方法中,您只需加载数据并保存到数据库中。加载数据后,应更新适配器的数据源并调用adapter.notifyDataSetChanged()以刷新listview。或者,您可以通知片段从数据库重新加载数据。确保它在首次加载更多数据时获得数据。我认为您的mMissionDB确实发生了变化,但是mData呢?您的适配器实际上使用mData作为数据源,因此您应该更新mData,并调用adapter.notifyDataSetChanged()刷新列表视图。希望它能对您有所帮助。hmm,也许不是最聪明的解决方案,但我过去所做的是刷新我的ArrayList,用新的ArrayList重新加载ArrayAdapter,然后将ArrayAdapter重新分配给ListView变量——就是这样。@Razgriz我尝试了您使用的方法,但效果不太好。我所做的是在onLoadMore()回调方法中,在pullToRefreshLayout.loadmoreFinish(pullToRefreshLayout.success)之后;我确实从数据库手动创建了一个新的ArrayList,并通过findViewById获取ListView的实例,然后将ArrayList分配给适配器,然后将其设置为ListView,但它不起作用。这件事真让我发疯。嗯,真奇怪。在创建“重新加载”ArrayAdapter之前,请尝试记录ArrayList的大小。可能,只是可能,您无法完全加载记录…?@RazgrizListView list=(ListView)pullToRefreshLayout.findViewById(R.id.content_view);List missionList=mMissionDB.loadMission();Log.d(Constants.Log_标记,“任务大小”+missionList.size());MissionListAdapter=(MissionListAdapter)list.getAdapter();adapter.setData(任务列表);list.setAdapter(适配器)代码>这是我在loadMoreFinish()回调后添加的,重新加载后大小仍然相同,你知道为什么吗?对不起,格式有问题,请看我问题的注释,我在onLoadMore()回调后添加了一些代码,数据的大小仍然和以前一样,你知道为什么吗?尝试在onFinish(String response)中添加一个List对象,并在for语句的List中添加Commission。for语句之后,使用runOnUiThread()将所有列表附加到适配器的日期源。谢谢,请参阅我的更新,这样更新数据集正确吗?如果正确,为什么数据集保持相同的大小?在我看来,插入数据库可能需要相同的时间,并且当您从数据库查询时,插入还没有完成。所以,你有相同的日期。我想一件事。它从一个新线程获取数据,对吗?然后在主线程绑定数据。当您在主线程更新数据时,是什么让您确保它已经在newThread获取了数据。如果你按照我上面所说的去做,我不能确定这是否是你处理数据的方式。这可能就是问题所在。@L.Meng据我所知,我在主线程中获取数据,但在另一个线程中更新数据。在使用Thread.join之后,我假设用于获取已更新数据的代码将在用于从网络收集数据的工作线程之后执行。是这样吗?@Lauren.Liuling是的,这就是问题所在,那么除了让线程休眠一段时间之外,你知道如何解决这个问题吗?
public interface Pullable
{
/**
* If pull up is not needed, set canPullUp to false
*
* @return true if the View can pull up
*/
boolean canPullUp();
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f2f2f2"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="5dp" />
<pulltorefresh.PullToRefreshLayout
android:id="@+id/refresh_view"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/refresh_head"/>
<!-- Supports all view that implemented the Pullable interface -->
<pulltorefresh.PullableListView
android:id="@+id/content_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<include layout="@layout/load_more"/>
</pulltorefresh.PullToRefreshLayout>
</LinearLayout>