为什么recyclerview适配器没有正确设置数据?

时间:2018-04-10 07:41:58

标签: android android-recyclerview recycler-adapter

几天前,我要求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);
   }

2 个答案:

答案 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。