有谁知道Firebase是否可以通过适配器通知查询。 [英] Does anyone know if Firebase can notify the adapter against a Query.

查看:145
本文介绍了有谁知道Firebase是否可以通过适配器通知查询。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我可以通知适配器更改查询吗?就像现在它什么都不做......任何人?


05-28 17:04:07.358 15585-15674 / com.example.rasmusjosefsson.rjcar
D / OpenGLRenderer:endAllStagingAnimators on 0x7ff46e405c00
(ListPopupWindow $ DropDownListView)with handle 0x7ff46f3d1b00


onCreate()

  private DatabaseReference mUserRef; 
private String mTravelTypeSelected;
私人查询queryRefSelected;
private FirebaseRecyclerAdapter< MyWaypoint,LatLngViewHolder> mFirebaseRecyclerViewAdapter;

@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
工具栏工具栏=(工具栏)findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar()。setDisplayShowTitleEnabled(false);

// *************** TRAVEL SPINNER ************** //
mSpinnerTravelType =(微调)findViewById(R.id.spinner_nav);

ArrayAdapter< CharSequence> adapter = ArrayAdapter.createFromResource(this,
R.array.traveltype_array,R.layout.spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

mSpinnerTravelType.setAdapter(adapter);

mSpinnerTravelType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){
@Override $ b $ public void onItemSelected(AdapterView<> parent,View view,int position,long id){

if(position == 0){
queryRefSelected = mUserRef;
} else if(position == 1){
queryRefSelected = mUserRef.orderByChild(travelType ).equalTo(Work);
mTravelTypeSelected =Work;
Log.i(TEST,position +);

} else if(位置== 2){
queryRefSelected = mUserRef.orderByChild(travelType)。equalTo(Private);
Log.i(TEST,position +);
}
mFirebaseRecyclerViewAdapter.notifyDataSetChanged();
}
$ b $ @覆盖
public void onNothingSelected(AdapterView<> parent){

}
});

recyclerView =(RecyclerView)findViewById(R.id.card_recycler_view);
recyclerView.setHasFixedSize(false);
LinearLayoutManager manager = new LinearLayoutManager(this);
manager.setReverseLayout(false);
recyclerView.setLayoutManager(manager);

$ / code $ / $ p

RecyclerViewAdapter

  private void attachRecyclerViewAdapter(){

mFirebaseRecyclerViewAdapter = new FirebaseRecyclerAdapter< MyWaypoint,LatLngViewHolder>(MyWaypoint.class,R.layout.list_item, LatLngViewHolder.class,queryRefSelected){
@Override
protected void populateViewHolder(final LatLngViewHolder latLngViewHolder,MyWaypoint item,final int i){

Log.i(SELECTED INSIDE POP ,queryRefSelected.toString());

字符串locA = item.getOrigin();
latLngViewHolder.locationA.setText(locA);

字符串locB = item.getDestination();
latLngViewHolder.locationB.setText(locB);

String distance = item.getDistance();
latLngViewHolder.distance.setText(distance);

final String duration = item.getDuration();

}
};
recyclerView.setAdapter(mFirebaseRecyclerViewAdapter);
}

onStart $ b

  @Override 
public void onStart(){
super.onStart();
FirebaseUser user = FirebaseAuth.getInstance()。getCurrentUser();
if(user!= null){

//用户登录
String mUserId = user.getUid();

// String userUrl = Constants.FIREBASE_URL +/ users /+ mUserId +/ waypoints;
String userUrl =https://rjcar3.firebaseio.com/users/lP1K8Ik0zrhaXD6AR6C0x7ozi5g2/waypoints;
mUserRef = FirebaseDatabase.getInstance()。getReferenceFromUrl(userUrl);

//设置标准查询
queryRefSelected = mUserRef;

//附加适配器
attachRecyclerViewAdapter();



$ div $解析方案

正在调用 mFirebaseRecyclerViewAdapter.notifyDataSetChanged(),它只会告诉RecyclerView刷新它已经有的视图。



你需要改变适配器的底层查询,你需要再次调用 attachRecyclerViewAdapter()来重新创建一个新的 Query 。如果你这样做,一定要在旧的适配器上调用 mFirebaseRecyclerViewAdapter.cleanup()

Can I notify the adapter to change the query? As now it does nothing... anyone?

05-28 17:04:07.358 15585-15674/com.example.rasmusjosefsson.rjcar D/OpenGLRenderer: endAllStagingAnimators on 0x7ff46e405c00 (ListPopupWindow$DropDownListView) with handle 0x7ff46f3d1b00

onCreate()

private DatabaseReference mUserRef;
private String mTravelTypeSelected;
private Query queryRefSelected;
private FirebaseRecyclerAdapter<MyWaypoint, LatLngViewHolder> mFirebaseRecyclerViewAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayShowTitleEnabled(false);

    //*************** TRAVEL SPINNER**************//
    mSpinnerTravelType = (Spinner) findViewById(R.id.spinner_nav);

    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
            R.array.traveltype_array, R.layout.spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    mSpinnerTravelType.setAdapter(adapter);

    mSpinnerTravelType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

            if (position == 0) {
                queryRefSelected = mUserRef;
            } else if (position == 1) {
                queryRefSelected = mUserRef.orderByChild("travelType").equalTo("Work");
                mTravelTypeSelected = "Work";
                Log.i("TEST", position + " ");

            } else if (position == 2) {
                queryRefSelected = mUserRef.orderByChild("travelType").equalTo("Private");
                Log.i("TEST", position + " ");
            }
            mFirebaseRecyclerViewAdapter.notifyDataSetChanged();
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

    recyclerView = (RecyclerView) findViewById(R.id.card_recycler_view);
    recyclerView.setHasFixedSize(false);
    LinearLayoutManager manager = new LinearLayoutManager(this);
    manager.setReverseLayout(false);
    recyclerView.setLayoutManager(manager);
}

RecyclerViewAdapter

private void attachRecyclerViewAdapter() {

    mFirebaseRecyclerViewAdapter = new FirebaseRecyclerAdapter<MyWaypoint, LatLngViewHolder>(MyWaypoint.class, R.layout.list_item, LatLngViewHolder.class, queryRefSelected) {
        @Override
        protected void populateViewHolder(final LatLngViewHolder latLngViewHolder, MyWaypoint item, final int i) {

            Log.i("SELECTED INSIDE POP", queryRefSelected.toString());

            String locA = item.getOrigin();
            latLngViewHolder.locationA.setText(locA);

            String locB = item.getDestination();
            latLngViewHolder.locationB.setText(locB);

            String distance = item.getDistance();
            latLngViewHolder.distance.setText(distance);

           final String duration = item.getDuration();

        }
    };
    recyclerView.setAdapter(mFirebaseRecyclerViewAdapter);    
}

onStart

@Override
public void onStart() {
    super.onStart();
    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    if (user != null) {

        // User is signed in
        String mUserId = user.getUid();

        // String userUrl = Constants.FIREBASE_URL + "/users/" + mUserId + "/waypoints";
        String userUrl = "https://rjcar3.firebaseio.com/users/lP1K8Ik0zrhaXD6AR6C0x7ozi5g2/waypoints";
        mUserRef = FirebaseDatabase.getInstance().getReferenceFromUrl(userUrl);

        // Set standard query
        queryRefSelected = mUserRef;

        // attaching the adapter
        attachRecyclerViewAdapter();
    }
}

解决方案

You are calling mFirebaseRecyclerViewAdapter.notifyDataSetChanged() which will only tell the RecyclerView to refresh the views it already has.

If you want to change the Adapter's underlying query, you will need to call attachRecyclerViewAdapter() again to re-create the adapter with a new Query. If you do this, make sure to call mFirebaseRecyclerViewAdapter.cleanup() on the old adapter.

这篇关于有谁知道Firebase是否可以通过适配器通知查询。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆