实际上我是从服务器获取数据并在我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());
}
}
};
答案 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);