使用" setAdapter()"是一个问题吗?在recyclerview不止一次?

时间:2018-03-01 13:18:27

标签: android android-recyclerview

实际上我是从服务器获取数据并在我recyclerview上显示的。但是它什么都没显示。即使经过很多问题的引用,我的问题也无法解决,但之后我尝试在获取数据后使用setAdapter()方法,现在我的问题就解决了。但我要问的是不止一次使用setAdapter这是不寻常的吗?。在我的第一次尝试中,我首先设置适配器,然后在从服务器获取数据后尝试使用adp.notifyDataSetChanged()。但现在我在获取数据后再次设置适配器。

代码:

private List<TImelineDataList> timelineDatalist;
@Override
public void onViewCreated(@NonNull View v, @Nullable Bundle savedInstanceState) {


    timelineDataList= new ArrayList<>();
    adapter=new CustomRecyclerViewAdapter(timelineDataList);
    recyclerView.setItemViewCacheSize(30);
    recyclerView.setDrawingCacheEnabled(true);
    recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
    recyclerView.setLayoutManager(new 
    LinearLayoutManager(ctx,LinearLayoutManager.HORIZONTAL,false));
    recyclerView.setAdapter(adapter);

}
 void addTimelineData(String email,String time,String img_link,String caption){
    timelineDataList.add(new TimelineData(email,time,img_link,caption));
    adapter=new CustomRecyclerViewAdapter(timelineDataList);
    adapter.notifyDataSetChanged();
    recyclerView.setAdapter(adapter);
}
  private  Emitter.Listener handlePosts = new Emitter.Listener(){

    @Override
    public void call(final Object... args){
        try {
            JSONArray jsonArray=(JSONArray)args[0];

               for(int i=0;i<jsonArray.length();i++){
                   try {
                       JSONObject ob=jsonArray.getJSONObject(i);
                       demo_email=ob.getString("_pid");

                       demo_time=ob.getString("time");

                       demo_link=ob.getString("img_link");

                       demo_caption=ob.getString("caption");


                       addTimelineData(demo_email,demo_time,demo_link,demo_caption);

                   } catch (JSONException e) {
                       e.printStackTrace();
                   }
               }




        } catch (Exception e) {
            Log.e("error",e.toString());
        }
    }
};

5 个答案:

答案 0 :(得分:1)

最后我弄明白了这个问题。问题在于构建适配器两次。现在我已经删除了下一个适配器构造和setAdapter(),并且它没有任何错误。

以前的代码

private List<TImelineDataList> timelineDatalist;
@Override
public void onViewCreated(@NonNull View v, @Nullable Bundle savedInstanceState) {


    timelineDataList= new ArrayList<>();
    **adapter=new CustomRecyclerViewAdapter(timelineDataList);**//Here
    recyclerView.setItemViewCacheSize(30);
    recyclerView.setDrawingCacheEnabled(true);
    recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
    recyclerView.setLayoutManager(new 
    LinearLayoutManager(ctx,LinearLayoutManager.HORIZONTAL,false));
    recyclerView.setAdapter(adapter);

}
 void addTimelineData(String email,String time,String img_link,String caption){
    timelineDataList.add(new TimelineData(email,time,img_link,caption));
    **adapter=new CustomRecyclerViewAdapter(timelineDataList);**//Here
    adapter.notifyDataSetChanged();
    recyclerView.setAdapter(adapter);
}
  private  Emitter.Listener handlePosts = new Emitter.Listener(){

    @Override
    public void call(final Object... args){
        try {
            JSONArray jsonArray=(JSONArray)args[0];

               for(int i=0;i<jsonArray.length();i++){
                   try {
                       JSONObject ob=jsonArray.getJSONObject(i);
                       demo_email=ob.getString("_pid");

                       demo_time=ob.getString("time");

                       demo_link=ob.getString("img_link");

                       demo_caption=ob.getString("caption");


                       addTimelineData(demo_email,demo_time,demo_link,demo_caption);

                   } catch (JSONException e) {
                       e.printStackTrace();
                   }
               }




        } catch (Exception e) {
            Log.e("error",e.toString());
        }
    }
};

新代码

private List<TImelineDataList> timelineDatalist= new ArrayList<>();;
@Override
public void onViewCreated(@NonNull View v, @Nullable Bundle savedInstanceState) {



    adapter=new CustomRecyclerViewAdapter(timelineDataList);
    recyclerView.setItemViewCacheSize(30);
    recyclerView.setDrawingCacheEnabled(true);
    recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
    recyclerView.setLayoutManager(new 
    LinearLayoutManager(ctx,LinearLayoutManager.HORIZONTAL,false));
    recyclerView.setAdapter(adapter);

}
 void addTimelineData(String email,String time,String img_link,String caption){
    timelineDataList.add(new TimelineData(email,time,img_link,caption));
    adapter.notifyDataSetChanged():
}
  private  Emitter.Listener handlePosts = new Emitter.Listener(){

    @Override
    public void call(final Object... args){
        try {
            JSONArray jsonArray=(JSONArray)args[0];

               for(int i=0;i<jsonArray.length();i++){
                   try {
                       JSONObject ob=jsonArray.getJSONObject(i);
                       demo_email=ob.getString("_pid");

                       demo_time=ob.getString("time");

                       demo_link=ob.getString("img_link");

                       demo_caption=ob.getString("caption");


                       addTimelineData(demo_email,demo_time,demo_link,demo_caption);

                   } catch (JSONException e) {
                       e.printStackTrace();
                   }
               }




        } catch (Exception e) {
            Log.e("error",e.toString());
        }
    }
};

答案 1 :(得分:0)

在将数据添加到附加到适配器的arraylist之后,调用adapter.notifyDataSetChanged()方法更新RecyclerView适配器。

你也可以调用方法notifyItemInserted(index),它可以显示添加了动画效果的项目。

答案 2 :(得分:0)

正确的方法是在适配器或该系列的其他方法上调用notifyDataSetChanged。 设置适配器的问题是您的滚动位置将丢失。

问题出现在您的CustomRecyclerViewAdapter中。好的做法是将timelineDatalist移到CustomRecyclerViewAdapter并使用类似的内容:

void addTimelineData(String email,String time,String img_link,String caption){
    adapter.addToTimelineDataList(new TimelineData(email,time,img_link,caption));
    adapter.notifyDataSetChanged();
}

请发布您的CustomRecyclerViewAdapter了解详情。

答案 3 :(得分:0)

我认为通常会多次使用setAdapter,因为它不会在功能上产生任何问题。但是如果你想使用

notifyDataSetChanged()

然后尝试在执行

时接收数据时不重新初始化数据
yourData = newData

然后这将重新初始化您的旧数据,notifyDataSetChanged()将无法使用

如果它的字符串然后尝试在当前实例中连接。

答案 4 :(得分:0)

对方法进行一些更改,如下面的代码..

        void addTimelineData (String email, String time, String img_link, String caption){
        timelineDataList.clear()
        timelineDataList.add(new TimelineData(email, time, img_link, caption));
        setAdapter();
    }

并制作一个像..的简单的setAdapter方法。

  public void setAdapter(){
    if (adpter==null){
        if(!timelineDataList.isEmpty()){
            adapter = new CustomRecyclerViewAdapter(timelineDataList);

        }
    }
    else{
        adapter.notifyDataSetChanged();
    }
}

并删除代码onCreate()define recyclerView.setAdapter(adapter);