几天前,我要求this question 避免重复reycylerview
项,其接受的答案帮助我避免重复数据。
但是现在我遇到了一些新的问题,例如:没有显示所有项目,有时只有这样的项目。真正的问题是,即使从服务器正确获取所有项目后,recyclerView
中的数据也未正确显示。数据会被随机跳过。我不明白问题出在哪里。我甚至尝试使用for loop
代替foreach
,但结果并没有不同。有人可以帮忙解决这个问题吗?从过去一周起,颈部一直疼痛。
代码:
private List<TimelineData> timelineDataList=new ArrayList<>() ;
public void onCreateView(){
recyclerview.setLayoutManager(new LinearLayoutManager(ctx));
//Setting Adapter
adapter=new CustomRecyclerViewAdapter(timelineDataList);
recyclerview.setAdapter(adapter);
}
@Override
public void onStart() {
super.onStart();
// Fetching data from server
socket.disconnect();
socket.connect();
//Getting Data from server
JSONObject obj=new JSONObject();
try {
obj.put("timeline_posts","all");
socket.emit("data",obj);
} catch (JSONException e) {
e.printStackTrace();
}
}
void addTimelineData(String type,String time,String img_link){
boolean isRepeated = false;
for(TimelineData data : timelineDataList){
if(data.getTime().equals(time)){
isRepeated = true;
}
}
if(!isRepeated){
timelineDataList.add(new TimelineData(type,time,img_link));
}
adapter.notifyDataSetChanged();
}
private Emitter.Listener handlePosts = new Emitter.Listener(){
@Override
public void call(final Object... args){
try {
JSONArray jsonArray=(JSONArray)args[0];
timelineDataList.clear(); //clear data before inserting new one
for(int i=0;i<jsonArray.length();i++){
try {
JSONObject ob=jsonArray.getJSONObject(i);
post_type=ob.getString("post_type");
post_time=ob.getString("time");
post_link=ob.getString("img_link");
addTimelineData(post_type,post_time,post_link);
} catch (JSONException e) {
e.printStackTrace();
}
}
} catch (Exception e) {
Log.e("error",e.toString());
}
}
};
适配器代码:
@Override
public void onBindViewHolder( CustomRecyclerViewHolder holder, int position) {
//Fetching TimelineData
TimelineData timelineData=totalList.get(position);
///Here I'm getting and converting array of image links which are there in jsonObject to arraylist
//Getting Imglink
Gson gson=new Gson();
Type type = new TypeToken<ArrayList<String>>() {}.getType();
ArrayList<String> arrayList = gson.fromJson(timelineData.getImg_link(), type);
//Setting ViewPager
CustomPagerAdapter adp=new CustomPagerAdapter(arrayList);
pager.setAdapter(new PagerAdapter() {
@Override
public int getCount() {
return 0;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return false;
}
});
holder.pager.setCurrentItem(position, false);
holder.pager.clearAnimation();
adp.notifyDataSetChanged();
holder.pager.setAdapter(adp);
holder.pager.setOffscreenPageLimit(1);
}
答案 0 :(得分:1)
您正在快速使用notifyDataSetChnaged()
,由此更改通知方法。这样您只能通知您插入的所选项目。
推荐方法:您需要将以下代码放在适配器中并从for loop
调用此方法,此处notifyDataSetChnaged
String s
将被public void insertItemInList(String s) {
if (list == null) list = new ArrayList<>();
list.add(s);
notifyItemInserted(list.size() - 1);
}
替换为你的模特课。通过这种方式,您只需在插入一个元素时通知一个元素。这也会自动创建一些插入动画。
for(int i=0;i<jsonArray.length();i++) {
try {
JSONObject ob=jsonArray.getJSONObject(i);
post_type=ob.getString("post_type");
post_time=ob.getString("time");
post_link=ob.getString("img_link");
addTimelineData(post_type,post_time,post_link);
} catch (JSONException e) {
e.printStackTrace();
}
}
adapter.notifyDataSetChanged();
或
当您的工作完成后,您可以调用notify outside for循环。
?access_token=TokenHere
问题是您正在快速通知适配器,它也可能导致UI不一致。
如果这可以解决您的问题,请告诉我。
答案 1 :(得分:0)
您正在修改非UI线程中的数据列表,这可能会导致RecyclerView出现问题。相反,您应该立即收集tempTimelineDataList中的所有数据,并在UI线程中更新适应的timelineDataList。