问题描述
在我的应用程序中使用 FirebaseRecyclerAdapter
并试图通过获取中的一些数据来填充它。populateViewHolder()
方法,然后赋值给不同的参数。这里是我的代码:
private void attachRecyclerViewAdapter(){
放置在
Query lastFifty = aReference.child(requestID).limitToFirst(50);
mRecyclerViewAdapter = new FirebaseRecyclerAdapter< AModelClass,AModelClass.ViewHolder>(
AModelClass.class,R.layout.a_layout,AModelClass.ViewHolder.class,lastFifty){
@Override
protected void populateViewHolder(final AModelClass.ViewHolder viewHolder,AModelClass model,int position){
final String key = this.getRef(position).getKey();
aReference.child(requestID).addListenerForSingleValueEvent(new ValueEventListener(){
@Override $ b $ public void onDataChange(DataSnapshot dataSnapshot){$ b $ if(dataSnapshot.getValue()!= null ){
aReference.child(requestID).child(key).addListenerForSingleValueEvent(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot){
$ b $ (dataSnapshot.getValue()!= null){
if(dataSnapshot.hasChild(pName)&&; dataSnapshot.hasChild(pUrl)&& dataSnapshot.hasChild (currentLat)&& amp; dataSnapshot.hasChild(currentLng)){
最终映射<字符串,字符串>映射=(映射<字符串,字符串>)dataSnapshot.g etValue();
pA = map.get(pName);
uidP = map.get(pUrl);
nP.add(map.get(pName));
cLatPlayers.add(map.get(currentLat)。trim());
cLngPlayers.add(map.get(currentLng)。trim());
viewHolder.setPNameT(pA);
viewHolder.setPicP(uidP);
viewHolder.setCurrentLatAU(String.valueOf(currentLtAU));
viewHolder.setCurrentLngAU(String.valueOf(currentLnAU));
addMarkers();
layout.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.INVISIBLE);
}
} else {
}
}
$ b $ @覆盖
public void onCancelled(DatabaseError databaseError ){
}
});
} else {
Toast.makeText(getBaseContext(),no data available yet,Toast.LENGTH_SHORT).show();
$ @覆盖
public void onCancelled(DatabaseError databaseError){
}
} );
}
};
mRecyclerViewAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver(){
@Override $ b $ public void onItemRangeRemoved(int positionStart,int itemCount){
}
@Override
public void onItemRangeInserted(int positionStart,int itemCount){
super.onItemRangeInserted(positionStart,itemCount);
}
@Override
public void onItemRangeChanged(int positionStart,int itemCount){
super.onItemRangeChanged(positionStart,itemCount);
}
});
aList.setAdapter(mRecyclerViewAdapter);
code
$ b $ p $ attachRecyclerViewAdapter()onCreate()
。
以下是
aList
初始化在onCreate()
:aList =(RecyclerView)findViewById R.id.aList);
aList.setLayoutManager(nLinearLayoutManager);
以下是
onLocationChanged()
方法: b>
@Override
public void onLocationChanged(Location location){
mCurrentLocation = location;
currentLtAU = mCurrentLocation.getLatitude();
currentLnAU = mCurrentLocation.getLongitude();
aReference.child(requestID).child(userID).child(currentLatUpdated).setValue(String.valueOf(currentLtAU));
aReference.child(requestID).child(userID).child(currentLngUpdated).setValue(String.valueOf(currentLnAU));
$ b $ p
$ b当位置在相同的参考下改变时,它将更新后的lat和lng保存到数据库
$ b
LocationRequest
代码:protected void createLocationRequest(){
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(1000);
mLocationRequest.setFastestInterval(500);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setSmallestDisplacement(0);
$ b $ p
$ b在这里一切正常,唯一的问题是引用的代码:
aReference.child(requestID).child(key)
或(aReference.child(requestID)
>也许?)被一次又一次地调用(虽然它应该被调用一次,因为addListenerForSingleValueEvent
),因此填充nP
,cLatPlayers
,cLngPlayers
多次,还有addMarkers()
方法在Map中被多次调用导致问题。
为什么会发生这种情况,我如何确保不会多次调用?
解决方案