我通过以下方法加载基于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而不是替换它们,但我希望确认。
答案 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);