Android RemoteViewFactory onDataSetChange被称为永久
我有一个RemoteViewService,我从firebase获得一些数据,数据正确加载并显示。但问题是onDataSetChanget()被永远调用,数据被加载,然后一次又一次地重新加载。我还尝试将firebaseSnapShoatListener放在oncreate中并正在工作,但is存在一些问题。更清楚地说,只有在调用方法getData时才会永远调用onDataSetChanged。为什么onDataSetChanget()被调用“永远”吗 这是我的代码:Android RemoteViewFactory onDataSetChange被称为永久,android,firebase,google-cloud-firestore,android-widget,remoteview,Android,Firebase,Google Cloud Firestore,Android Widget,Remoteview,我有一个RemoteViewService,我从firebase获得一些数据,数据正确加载并显示。但问题是onDataSetChanget()被永远调用,数据被加载,然后一次又一次地重新加载。我还尝试将firebaseSnapShoatListener放在oncreate中并正在工作,但is存在一些问题。更清楚地说,只有在调用方法getData时才会永远调用onDataSetChanged。为什么onDataSetChanget()被调用“永远”吗 这是我的代码: public class T
public class TaskWidgetService extends RemoteViewsService {
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
return new TaskWidgetItemFactory(getApplicationContext(), intent);
}
class TaskWidgetItemFactory implements RemoteViewsFactory {
private Context context;
private int appWidgetId;
private List<Task> taskList = new ArrayList<>();
private FirebaseFirestore firestore = FirebaseFirestore.getInstance();
private CollectionReference collectionReference = firestore.collection("Users")
.document(FirebaseAuth.getInstance().getCurrentUser().getUid())
.collection("Tasks");
private ListenerRegistration listenerRegistration;
public TaskWidgetItemFactory(Context context, Intent intent) {
this.context = context;
this.appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
}
@Override
public void onCreate() {
listenerRegistration = collectionReference.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
if (e != null) {
//error
} else {
for (DocumentChange dc : queryDocumentSnapshots.getDocumentChanges()) {
int oldIndex = dc.getOldIndex();
int newIndex = dc.getNewIndex();
DocumentSnapshot documentSnapshot = dc.getDocument();
Task task = documentSnapshot.toObject(Task.class);
switch (dc.getType()) {
case ADDED:
taskList.add(newIndex, task);
AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(appWidgetId, R.id.tasks_stack_view);
break;
case REMOVED:
taskList.remove(oldIndex);
AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(appWidgetId, R.id.tasks_stack_view);
break;
case MODIFIED:
break;
}
}
}
}
});
}
@Override
public void onDataSetChanged() {
// getData();
}
private void getData() {
listenerRegistration = collectionReference.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
if (e != null) {
//error
} else {
for (DocumentChange dc : queryDocumentSnapshots.getDocumentChanges()) {
int oldIndex = dc.getOldIndex();
int newIndex = dc.getNewIndex();
DocumentSnapshot documentSnapshot = dc.getDocument();
Task task = documentSnapshot.toObject(Task.class);
switch (dc.getType()) {
case ADDED:
taskList.add(newIndex, task);
break;
case REMOVED:
taskList.remove(oldIndex);
break;
case MODIFIED:
break;
}
}
AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(appWidgetId, R.id.tasks_stack_view);
}
}
});
}
@Override
public void onDestroy() {
listenerRegistration.remove();
}
@Override
public int getCount() {
return taskList.size();
}
@Override
public RemoteViews getViewAt(int position) {
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_item);
remoteViews.setTextViewText(R.id.widget_text_view_task_name, taskList.get(position).getName());
remoteViews.setTextViewText(R.id.text_view_time_widget, taskList.get(position).getTime());
remoteViews.setTextViewText(R.id.text_view_date_widget, taskList.get(position).getDate());
return remoteViews;
}
@Override
public RemoteViews getLoadingView() {
return null;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public boolean hasStableIds() {
return true;
}
}
}
公共类TaskWidgetService扩展了RemoteViewsService{
@凌驾
公共远程视图工厂onGetViewFactory(意图){
返回新TaskWidgetItemFactory(getApplicationContext(),intent);
}
类TaskWidgetItemFactory实现RemoteViewsFactory{
私人语境;
私有int-appWidgetId;
private List taskList=new ArrayList();
私有FirebaseFirestore firestore=FirebaseFirestore.getInstance();
private CollectionReference CollectionReference=firestore.collection(“用户”)
.document(FirebaseAuth.getInstance().getCurrentUser().getUid())
.收集(“任务”);
私人收听者注册收听者注册;
公共任务WidgetItemFactory(上下文、意图){
this.context=上下文;
this.appWidgetId=intent.getIntExtra(AppWidgetManager.EXTRA\u APPWIDGET\u ID,
AppWidgetManager。无效的\u APPWIDGET\u ID);
}
@凌驾
public void onCreate(){
listenerRegistration=collectionReference.addSnapshotListener(新的EventListener(){
@凌驾
public void OneEvent(@Nullable QuerySnapshot queryDocumentSnapshots,@Nullable FirebaseFirestoreException e){
如果(e!=null){
//错误
}否则{
对于(DocumentChange dc:queryDocumentSnapshots.getDocumentChanges()){
int oldIndex=dc.getOldIndex();
int newIndex=dc.getNewIndex();
DocumentSnapshot DocumentSnapshot=dc.getDocument();
Task Task=documentSnapshot.toObject(Task.class);
开关(dc.getType()){
案件补充:
taskList.add(newIndex,task);
AppWidgetManager.getInstance(上下文).notifyAppWidgetViewDataChanged(appWidgetId,R.id.tasks\u堆栈\u视图);
打破
已删除的案例:
任务列表。删除(旧索引);
AppWidgetManager.getInstance(上下文).notifyAppWidgetViewDataChanged(appWidgetId,R.id.tasks\u堆栈\u视图);
打破
案例修改:
打破
}
}
}
}
});
}
@凌驾
公共无效onDataSetChanged(){
//getData();
}
私有void getData(){
listenerRegistration=collectionReference.addSnapshotListener(新的EventListener(){
@凌驾
public void OneEvent(@Nullable QuerySnapshot queryDocumentSnapshots,@Nullable FirebaseFirestoreException e){
如果(e!=null){
//错误
}否则{
对于(DocumentChange dc:queryDocumentSnapshots.getDocumentChanges()){
int oldIndex=dc.getOldIndex();
int newIndex=dc.getNewIndex();
DocumentSnapshot DocumentSnapshot=dc.getDocument();
Task Task=documentSnapshot.toObject(Task.class);
开关(dc.getType()){
案件补充:
taskList.add(newIndex,task);
打破
已删除的案例:
任务列表。删除(旧索引);
打破
案例修改:
打破
}
}
AppWidgetManager.getInstance(上下文).notifyAppWidgetViewDataChanged(appWidgetId,R.id.tasks\u堆栈\u视图);
}
}
});
}
@凌驾
公共空间{
listenerRegistration.remove();
}
@凌驾
public int getCount(){
返回taskList.size();
}
@凌驾
公共远程视图getViewAt(内部位置){
RemoteViews RemoteView=新的RemoteView(context.getPackageName(),R.layout.widget_项);
setextviewtext(R.id.widget_text_view_task_name,taskList.get(position.getName());
setextviewtext(R.id.text\u view\u time\u小部件,taskList.get(position.getTime());
setextviewtext(R.id.text\u view\u date\u小部件,taskList.get(position.getDate());
返回远程视图;
}
@凌驾
公共远程视图getLoadingView(){
返回null;
}
@凌驾
public int getViewTypeCount(){
返回1;
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共布尔表ID(){
返回true;
}
}
}