RecyclerView在背面复制

时间:2016-12-06 03:07:36

标签: android android-fragments firebase android-recyclerview firebase-realtime-database

我通过以下方法加载基于Firebase数据的Recyclerview:

 @Override
public void onStart() {
    super.onStart();
    mChildEventListener = new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            String newPollEpoch = dataSnapshot.getKey();
                if (mNewPollsAray.contains(newPollEpoch)) {
                    Log.v("POLL_ADDED", "POLL ADDED: " + newPollEpoch);
                } else {
                    Log.v("Child_Added", "The new child is " + newPollEpoch);
                    String newPollImageURL = dataSnapshot.child(IMAGE_URL).getValue(String.class);
                    //TODO: On additional devices, numbesr are not appearing as the question
                    String newPollQuestion = dataSnapshot.child(QUESTION_STRING).getValue(String.class);
                    String convertedQuestion = newPollQuestion.toString();
                    mNewPollsAray.add(0, new Poll(convertedQuestion, newPollImageURL, newPollEpoch));
                    mNewPollsAdapter.notifyDataSetChanged();
                    Log.v("OnChildChanged", "OnCHILDCHANGEDCALLED " + dataSnapshot.getKey());
                }

            }



        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    };
    mPollsRef.addChildEventListener(mChildEventListener);

}

@Override
public void onStop() {
    super.onStop();
    mPollsRef.removeEventListener(mChildEventListener);
}

这是我点击recyclerview中的项目时调用的方法:

 @Override
        public void onClick(View view) {
            view.getId();
            int itemPosition = getAdapterPosition();
            String passEpoch = mNewPollsAray.get(itemPosition).getPollID();
            Log.v("PASSED_ID", "The passed ID is " + passEpoch);
            Intent toPoll = new Intent(getActivity(), PollHostActivity.class);
            toPoll.putExtra("POLL_ID", passEpoch);
            startActivity(toPoll);
        }

我从中加载它的片段是TabLayout的一部分。当我在选项卡之间导航时,recyclerview正确加载。

但是,当我单击recyclerview中的某个项目(将我带到一个新活动)然后导航回包含recyclerview的片段时,项目会重复,并且recyclerview项目都会出现故障。我认为它与多次调用onStart()有关,并且基本上将新项目“堆叠”到recyclerview而不是替换它们,但我希望确认。

3 个答案:

答案 0 :(得分:1)

您可以尝试使用代码,我面临类似的问题,并通过更改来解决。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    if(mMainLayout == null)
    {
      mMainLayout = inflater.inflate(R.layout.fragment_main, container,false);
...
    } 
    return mMainLayout;
}

当mMainlayout不为null时,表示您的片段实例已经有一个mMainLayout实例,并且已经添加到ViewGroup容器中,无需再次添加它。当您将同一视图再次添加到同一容器时,可能会遇到问题。

答案 1 :(得分:1)

这是因为您添加了一个侦听器,但从未删除它。因此,下次进入视图时,您将添加第二个侦听器,从而为数据库中的每个项目调用onChildAdded()两次。

解决方案是在退出视图时删除侦听器。由于您在onStart()中附加了监听器,因此您应该在onStop()

中再次将其删除
@Override
public void onStop() {
    mPollsRef.removeEventListener(mChildEventListener);
}

答案 2 :(得分:0)

通过清除数据集,您可以避免在Recycler View中再次加载类似的项目。它对我有用。

             listOftrailers.clear();

              try {

            JSONObject jsonObject = new JSONObject(data);
            JSONArray jsonArray = jsonObject.getJSONArray("results");

            for (int i = 0; i < jsonArray.length(); i++) {
                MovieTrailer item = new MovieTrailer();

                JSONObject js = jsonArray.getJSONObject(i);
                item.setVideoID(js.getString("id"));
                item.setVideoName(js.getString("name"));

                item.setVideoKey(js.getString("key"));
                item.setVideoSite(js.getString("site"));
                item.setVideoType(js.getString("type"));

                String name = item.getVideoName();
                if (name.contains("Official Trailer") || 
                         name.startsWith("Official"))
                    listOftrailers.add(item);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        videosadapter = new TrailerListAdapter(listOftrailers.size(), 
                            listOftrailers, MoviePage.this);
        recyclerView.setAdapter(videosadapter);