Android Firebase RecyclerView未加载新数据

Android Firebase RecyclerView未加载新数据,android,firebase,firebase-realtime-database,firebaseui,Android,Firebase,Firebase Realtime Database,Firebaseui,每次用户向Firebase中的某个数据库引用添加项目时,我都会尝试创建一个实时RecyclerView。这是我的模型课: @IgnoreExtraProperties public class Poll { private String question; private String image_URL; public Poll() { } public Poll(String Question, String Image_URL){ this.question = Questi

每次用户向Firebase中的某个数据库引用添加项目时,我都会尝试创建一个实时RecyclerView。这是我的模型课:

@IgnoreExtraProperties
public class Poll {

private String question;
private String image_URL;

public Poll() {
}

public Poll(String Question, String Image_URL){
    this.question = Question;
    this.image_URL = Image_URL;
}


public String getQuestion() {
    return question;
}

public void setQuestion(String question) {
    question = question;
}

public String getImage_URL() {
    return image_URL;
}

public void setImage_URL(String image_URL) {
    image_URL = image_URL;
}

@Exclude
public Map<String, Object> toMap(){
    HashMap<String, Object> result = new HashMap<>();
    result.put("question", question);
    result.put("image_URL", image_URL);
    return result;
}
@ignoreextroperties
公众阶级投票{
私有字符串问题;
私有字符串图像的URL;
民意测验(){
}
公众投票(字符串问题、字符串图像\u URL){
这个问题=问题;
this.image\u URL=image\u URL;
}
公共字符串getQuestion(){
返回问题;
}
公共问题(字符串问题){
问题=问题;
}
公共字符串getImage_URL(){
返回图片地址;
}
public void setImage\u URL(字符串image\u URL){
image\u URL=image\u URL;
}
@排除
公共地图toMap(){
HashMap结果=新建HashMap();
结果.付诸表决(“质询”,质询);
结果.put(“image\u URL”,image\u URL);
返回结果;
}
下面是我将数据保存到Firebase的类。它实际上正在写入Firebase,因此我可以确认我正在正确写入它:

    mSubmitPollCreation.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            //TODO: Need to check if poll requirements are added, i.e. Question, Answer, ......
            //check if image has been loaded first
            if (resultImageURL == null){
                Toast.makeText(getApplicationContext(),getResources().getString(R.string.no_image_selected),Toast.LENGTH_LONG).show();
                return;
            }

            Poll poll = new Poll(mCreatePollQuestion.getText().toString(), resultImageURL);
            Map <String, Object> pollMap = poll.toMap();
            String key = mBaseRef.child("Polls").push().getKey();
            Map<String, Object> childUpdates = new HashMap<String, Object>();
            childUpdates.put("/Polls/" + key, pollMap);
            mBaseRef.updateChildren(childUpdates);

            Intent toHomeActivity = new Intent(CreateActivity.this, HomeActivity.class);
            toHomeActivity.putExtra("viewpager_position", 2);
            startActivity(toHomeActivity);
        }
    });
mSubmitPollCreation.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO:需要检查是否添加了投票要求,即问题、答案等。。。。。。
//检查是否已首先加载图像
if(resultImageURL==null){
Toast.makeText(getApplicationContext(),getResources().getString(R.string.no\u image\u selected),Toast.LENGTH\u LONG.show();
返回;
}
Poll Poll=new Poll(mCreatePollQuestion.getText().toString(),resultImageURL);
Map pollMap=poll.toMap();
String key=mBaseRef.child(“轮询”).push().getKey();
Map childUpdates=newhashmap();
childUpdates.put(“/Polls/”+键,pollMap);
mBaseRef.updateChildren(childUpdates);
Intent to HomeActivity=新的Intent(CreateActivity.this、HomeActivity.class);
toHomeActivity.putExtra(“查看页面位置”,2);
startActivity(toHomeActivity);
}
});
我希望在添加项目时,recyclerview能够在所有设备上实时更新。以下是我使用Firebase UI库填充recyclerview的片段。在我向Firebase添加数据/写入之前的代码片段中列出的内容时,我没有在任何设备上看到任何实时更新:

public class LiveFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";

private RecyclerView mRecyclerview;
private DatabaseReference mBaseRef;
private DatabaseReference mPollsRef;
private LinearLayoutManager mLayoutManager;

private FirebaseRecyclerAdapter <Poll, PollHolder> mFireAdapter;


// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;

private OnFragmentInteractionListener mListener;

public LiveFragment() {
    // Required empty public constructor
}

/**
 * Use this factory method to create a new instance of
 * this fragment using the provided parameters.
 *
 * @param param1 Parameter 1.
 * @param param2 Parameter 2.
 * @return A new instance of fragment LiveFragment.
 */
// TODO: Rename and change types and number of parameters
public static LiveFragment newInstance(String param1, String param2) {
    LiveFragment fragment = new LiveFragment();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);

    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    final View v = inflater.inflate(R.layout.fragment_new, container, false);
    mRecyclerview = (RecyclerView) v.findViewById(R.id.new_RecyclerView);
    mBaseRef = FirebaseDatabase.getInstance().getReference();
    mPollsRef = mBaseRef.child("Polls");

    if (mRecyclerview != null){
        mRecyclerview.setHasFixedSize(true);
    }

    mLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext());
    mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL
    );

    mRecyclerview.setLayoutManager(mLayoutManager);
    return v;
}

// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
    if (mListener != null) {
        mListener.onFragmentInteraction(uri);
    }
}

@Override
public void onStart() {
    super.onStart();

    mFireAdapter = new FirebaseRecyclerAdapter<Poll, PollHolder>(
            Poll.class,
            R.layout.latest_item,
            PollHolder.class,
            mPollsRef
    ){

        @Override
        protected void populateViewHolder(PollHolder viewHolder, Poll model, int position) {
            viewHolder.mPollQuestion.setText(model.getQuestion());
            Picasso.with(getActivity().getApplicationContext())
                    .load(model.getImage_URL())
                    .fit()
                    .into(viewHolder.mPollImage);
            Log.v("QUESTION", model.getQuestion());
            Log.v("IMAGE", model.getImage_URL());

        }
    };

    mRecyclerview.setAdapter(mFireAdapter);
}

@Override
public void onStop() {
    super.onStop();
    if (mFireAdapter != null){
        mFireAdapter.cleanup();
    }
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OnFragmentInteractionListener) {
        mListener = (OnFragmentInteractionListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnFragmentInteractionListener");
    }
}

@Override
public void onDetach() {
    super.onDetach();
    mListener = null;
}


public static class PollHolder extends RecyclerView.ViewHolder {

    TextView mPollQuestion;
    ImageView mPollImage;


    public PollHolder(View itemView) {
        super(itemView);

        mPollQuestion = (TextView) itemView.findViewById(R.id.latest_item_question);
        mPollImage = (ImageView) itemView.findViewById(R.id.pollThumbNailImage);

    }
}

/**
 * This interface must be implemented by activities that contain this
 * fragment to allow an interaction in this fragment to be communicated
 * to the activity and potentially other fragments contained in that
 * activity.
 * <p>
 * See the Android Training lesson <a href=
 * "http://developer.android.com/training/basics/fragments/communicating.html"
 * >Communicating with Other Fragments</a> for more information.
 */
public interface OnFragmentInteractionListener {
    // TODO: Update argument type and name
    void onFragmentInteraction(Uri uri);
   }
}
公共类LiveFragment扩展了片段{
//TODO:重命名参数参数,选择匹配的名称
//片段初始化参数,例如ARG_ITEM_NUMBER
私有静态最终字符串ARG_PARAM1=“PARAM1”;
私有静态最终字符串ARG_PARAM2=“PARAM2”;
私人回收视图mRecyclerview;
私人数据库参考mBaseRef;
私有数据库参考mPollsRef;
私人直线酒店经理;
专用FirebaseRecyclerAdapter mFireAdapter;
//TODO:重命名和更改参数类型
私有字符串mParam1;
私有字符串mParam2;
私有OnFragmentInteractionListener mListener;
公共LiveFragment(){
//必需的空公共构造函数
}
/**
*使用此工厂方法创建的新实例
*使用提供的参数创建此片段。
*
*@param param1参数1。
*@param param2参数2。
*@return一个fragment LiveFragment的新实例。
*/
//TODO:重命名和更改参数的类型和数量
公共静态LiveFragment newInstance(字符串param1,字符串param2){
LiveFragment=新的LiveFragment();
Bundle args=新Bundle();
args.putString(ARG_PARAM1,PARAM1);
args.putString(ARG_PARAM2,PARAM2);
fragment.setArguments(args);
返回片段;
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
如果(getArguments()!=null){
mParam1=getArguments().getString(ARG_PARAM1);
mParam2=getArguments().getString(ARG_PARAM2);
}
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
最终视图v=充气机充气(R.layout.fragment_new,container,false);
mRecyclerview=(RecyclerView)v.findViewById(R.id.new\u RecyclerView);
mBaseRef=FirebaseDatabase.getInstance().getReference();
mPollsRef=mBaseRef.child(“轮询”);
if(mRecyclerview!=null){
mRecyclerview.setHasFixedSize(true);
}
mLayoutManager=newlinearlayoutmanager(getActivity().getApplicationContext());
mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL
);
mRecyclerview.setLayoutManager(mllayoutmanager);
返回v;
}
//TODO:重命名方法、更新参数并将方法挂接到UI事件中
public void onButtonPressed(Uri){
if(mListener!=null){
onFragmentInteraction(uri);
}
}
@凌驾
public void onStart(){
super.onStart();
mFireAdapter=新的FirebaseRecyclerAdapter(
民意测验课,
R.布局。最新的_项目,
PollHolder.class,
mPollsRef
){
@凌驾
受保护的void populateViewHolder(PollHolder viewHolder、Poll模型、int位置){
viewHolder.mPollQuestion.setText(model.getQuestion());
Picasso.with(getActivity().getApplicationContext())
.load(model.getImage\u URL())
.fit()
.into(viewHolder.mpolimage);
Log.v(“QUESTION”,model.getQuestion());
Log.v(“IMAGE”,model.getImage_URL());
}
};
mRecyclerview.setAdapter(mFireAdapter);
}
@凌驾
公共void onStop(){
super.onStop();
if(mFireAdapter!=null){
mFireAdapter.cleanup();
}
}
@凌驾
公共void-onAttach(上下文){
super.onAttach(上下文);
if(OnFragmentInteractionListener的上下文实例){
mListener=(OnFragmentInteractionListener)上下文;
}否则{
抛出新的RuntimeException(context.toString()
+“必须实现OnFragmentInteraction
public void setQuestion(String question) {
    this.question = question;
}

public void setImage_URL(String image_URL) {
    this.image_URL = image_URL;
}
    Map <String, Object> pollMap = poll.toMap();
    String key = mBaseRef.child("Polls").push().getKey();
    Map<String, Object> childUpdates = new HashMap<String, Object>();
    childUpdates.put("/Polls/" + key, pollMap);
    mBaseRef.updateChildren(childUpdates);
mBaseRef.child("Polls").push().setValue(poll, new DatabaseReference.CompletionListener() {
    @Override
    public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
        if (databaseError == null) {
            Log.i("Poll", "onComplete: SUCCESS");
        } else {
            Log.w("Poll", "onComplete: ", databaseError.toException());
        }
    }
});
//...
mRecyclerview.setLayoutManager(mLayoutManager);
mFireAdapter = ...;
mRecyclerview.setAdapter(mFireAdapter);

return v;