Firebase RecylcerView适配器无法获得准确的视图位置

我正在使用Firebase用户界面,遇到了一个独特的问题。 当我加载RecyclerView时,没有问题。 我单击RecyclerView上的项目并获取所单击项目的.push()值。 然后,它会从Firebase .push()值中获取数据,该值存储在Firebase数据库中,并将其发送到另一个活动。 见下图:

在此处输入图像描述 在此处输入图像描述

第二个图像是通过意图接收数据的活动。 当我点击返回RecyclerView时,我再次点击“8”,我正在加载一个不同的数字(现在它似乎是1)。

最后,我担心我没有正确设置RecyclerView。 这是我的代码:

创建投票对象(PO​​JO)并写入Firebase:

mSubmitPollCreation.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //TODO: Need to check if poll requirements are added, ie 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; } //capture answers if (mNumberOfPollAnswersCreatedByUser > 5) { Toast.makeText(getApplicationContext(), getResources().getText(R.string.poll_answers_greater_than_five), Toast.LENGTH_LONG).show(); mNumberOfPollAnswersCreatedByUser = 5; } for (int i = 0; i < mNumberOfPollAnswersCreatedByUser; i++) { EditText editText = (EditText) mEditTextAnswerLayout.findViewWithTag(getResources().getString(R.string.created_answer_editText_id) + String.valueOf(i + 1)); String editTextInputForAnswer = String.valueOf(editText.getText()); mPollAnswers.add(0, editTextInputForAnswer); Toast.makeText(getApplicationContext(),editTextInputForAnswer,Toast.LENGTH_SHORT).show(); } Poll poll = new Poll(mCreatePollQuestion.getText().toString(), resultImageURL, mPollAnswers); Map pollMap = poll.toMap(); final String key = mBaseRef.child("Polls").push().getKey(); Map childUpdates = new HashMap(); childUpdates.put("/Polls/" + key, pollMap); mBaseRef.updateChildren(childUpdates); Collections.reverse(mPollAnswers); for (int i = 0; i < mPollAnswers.size(); i++) { mBaseRef.child("Polls").child(key).child("answers").child(String.valueOf(i + 1)).updateChildren(poll.answerConvert(mPollAnswers, i)); } Intent toHomeActivity = new Intent(CreateActivity.this, HomeActivity.class); toHomeActivity.putExtra("viewpager_position", 2); startActivity(toHomeActivity); } }); 

我从Firebase读取并填充RecyclerView的位置:

 public class LiveFragment extends Fragment { // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, eg 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 FloatingActionButton mFloatingActionAdd; private FirebaseRecyclerAdapter mFireAdapter; private RecyclerView.ItemAnimator mItemAnimator; // 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); mBaseRef = FirebaseDatabase.getInstance().getReference(); mPollsRef = mBaseRef.child("Polls"); 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); Log.v("TAG", "ON CREATE CALLED FROM NEW"); mRecyclerview = (RecyclerView) v.findViewById(R.id.list); mRecyclerview.setItemAnimator(new SlideInLeftAnimator()); mLayoutManager = new LinearLayoutManager(getContext()); mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); mLayoutManager.setReverseLayout(true); mLayoutManager.setStackFromEnd(true); mFloatingActionAdd = (FloatingActionButton) getActivity().findViewById(R.id.myFAB); mFloatingActionAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent I = new Intent(getActivity().getApplicationContext(), CreateActivity.class); startActivity(I); } }); 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); } scrollToPosition(); } @Override public void onStart() { super.onStart(); mFireAdapter = new FirebaseRecyclerAdapter(Poll.class, R.layout.latest_item, PollHolder.class, mBaseRef.child("Polls")) { @Override protected void populateViewHolder(PollHolder viewHolder, final Poll model, final int position) { viewHolder.mPollQuestion.setText(model.getQuestion()); Picasso.with(getActivity().getApplicationContext()) .load(model.getImage_URL()) .fit() .into(viewHolder.mPollImage); viewHolder.mView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.v("TAG", model.toString()); Log.v("TAG","ONCLICKED"); Intent toPoll = new Intent(getActivity(), PollHostActivity.class); toPoll.putExtra("POLL_ID", mFireAdapter.getRef(position).getKey()); startActivity(toPoll); } }); Log.v("TAG", mFireAdapter.getRef(position).getKey()); Log.v("TAG", String.valueOf(position)); Log.v("TAG", model.getQuestion()); Log.v("TAG", model.getImage_URL()); } }; mRecyclerview.setAdapter(mFireAdapter); scrollToPosition(); } @Override public void onStop() { super.onStop(); if (mFireAdapter != null) { mFireAdapter.cleanup(); } } @Override public void onDetach() { super.onDetach(); mListener = null; } public static class PollHolder extends RecyclerView.ViewHolder implements View.OnClickListener { TextView mPollQuestion; ImageView mPollImage; View mView; public PollHolder(View itemView) { super(itemView); mPollQuestion = (TextView) itemView.findViewById(R.id.latest_item_question); mPollImage = (ImageView) itemView.findViewById(R.id.pollThumbNailImage); this.mView = itemView; itemView.setOnClickListener(this); } @Override public void onClick(View view) { Log.v("TAG", "CLICKED"); } } private void scrollToPosition(){ mFireAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { @Override public void onItemRangeInserted(int positionStart, int itemCount) { super.onItemRangeInserted(positionStart, itemCount); int pollCount = mFireAdapter.getItemCount(); int lastVisiblePosition = mLayoutManager.findLastCompletelyVisibleItemPosition(); // If the recycler view is initially being loaded or the user is at the bottom of the list, scroll // to the bottom of the list to show the newly added message. if (lastVisiblePosition == -1 || (positionStart >= (pollCount - 1) && lastVisiblePosition == (positionStart - 1))) { mRecyclerview.scrollToPosition(positionStart); } } }); } } 

我的想法:

  1. 我在正确的位置调用mFireAdapter.cleanup()吗?

  2. 单击“8”并看到“1”的问题不会出现在RecyclerView的第一次加载中,只有当我从活动(第二个图像)开始并导航回RecyclerView时才会出现。

  3. 我调用.setStackFromEnd(true)和.setReverseLayout(true)来反转存储在FirebaseDatabase中的数据,这可能会导致问题。

  4. 我在.populateViewHolder()方法中设置了.setOnClickListener(),并使用以下命令将意图中的.push()键传递给下一个活动:

      toPoll.putExtra("POLL_ID", mFireAdapter.getRef(position).getKey()); 

此方法可能是获取不正确的密钥。

最后,Firebase数据库:

在此处输入图像描述

任何帮助,将不胜感激!

您不应该使用populateViewHolder之外的position ,因为它的值可能不同。 相反,将viewHolder final,并使用viewHolder.getAdapterPosition()替换它。