在这个问题中“RecyclerView: No Adapter attached; skipping layout” for recyclerview我抱怨说没有附加适配器;跳过布局"使用RecyclerView时出错。部分是因为我没有得到解决这个问题的解决方案,我在Android Studio上疯狂了;在这个过程中,我打开了RecyclerView类,我发现该错误将显示的唯一条件是适配器为空时。我已经初始化并附加了适配器。我搜索并搜索了谷歌;没有解决方案。
我不明白,如果我移动初始化并附加到onCreate方法,应用程序会完全崩溃。
我现在的问题是:什么时候在RecyclerView中是一个适配器null,问题的解决方案可能是什么?
请帮助绿色开发者;这是我的第一个应用程序。 任何建议都会受到欢迎。
MainActivity.java的这一部分
//Creating Views
private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;
private RecyclerView.LayoutManager layoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Initializing Views
recyclerView = (RecyclerView) findViewById(R.id.post_recycler);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
//Adding adapter to recyclerview
recyclerView.setAdapter(adapter);
我也试过这个: 的 MainActivity.java
//Creating Views
private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;
private RecyclerView.LayoutManager layoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Initializing Views
recyclerView = (RecyclerView) findViewById(R.id.post_recycler);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Initializing Views
recyclerView = (RecyclerView) findViewById(R.id.post_recycler);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
//Initializing the postlist list
mPostItemsList = new ArrayList<>();
//Caling method to get data
getData();
//This method will get data from the web api
private void getData(){
//Showing progress dialog
final ProgressDialog progressDialog = ProgressDialog.show(this, "Loading posts", "Please wait", false, false);
//Creating a json request
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(ConfigPost.GET_URL,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
//Dismissing the progress dialog
progressDialog.dismiss();
//calling method to parse json array
parseData(response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
//Creating request queue
RequestQueue requestQueue = Volley.newRequestQueue(this);
//Adding request to the queue
requestQueue.add(jsonArrayRequest);
}
//This method will parse json data
private void parseData(JSONArray array){
for(int i = 0; i<array.length(); i++) {
PostItems postItem = new PostItems();
JSONObject jsonObject = null;
try {
jsonObject = array.getJSONObject(i);
postItem.setPost_image(jsonObject.getString(ConfigPost.TAG_POST_IMAGE));
postItem.setPost_title(jsonObject.getString(ConfigPost.TAG_POST_TITLE));
postItem.setPost_body(jsonObject.getString(ConfigPost.TAG_POST_BODY));
} catch (JSONException w) {
w.printStackTrace();
//Toast.makeText(this, "Error in parsing Json", Toast.LENGTH_LONG).show();
}
mPostItemsList.add(postItem);
}
//Finally initialing the adapter
adapter = new PostAdapter(mPostItemsList, this);
//Adding adapter to recyclerview
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
适配器类
public class PostAdapter extends RecyclerView.Adapter<PostAdapter.ViewHolder>{
private ImageLoader mImageLoader;
private Context mContext;
//List of posts
List<PostItems> mPostItems;
public PostAdapter(List<PostItems> postItems, Context context) {
super();
//Getting all Posts
this.mPostItems = postItems;
this.mContext = context;
}
@Override
public ViewHolder onCreateViewHolder (ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.post_summ, parent, false);
ViewHolder viewHolder = new ViewHolder(v);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
PostItems postList = mPostItems.get(position);
mImageLoader = VolleyRequest.getInstance(mContext).getImageLoader();
mImageLoader.get(postList.getPost_image(), ImageLoader.getImageListener(holder.postImage, R.mipmap.ic_launcher, android.R.drawable.ic_dialog_alert));
holder.postImage.setImageUrl(postList.getPost_image(), mImageLoader);
holder.postTitle.setText(postList.getPost_title());
holder.postBody.setText(postList.getPost_body());
}
@Override
public int getItemCount(){
//Return the number of items in the data set
return mPostItems.size();
}
class ViewHolder extends RecyclerView.ViewHolder {
public NetworkImageView postImage;
public TextView postTitle;
public TextView postBody;
public ViewHolder(View postView) {
super(postView);
postImage = (NetworkImageView) postView.findViewById(R.id.post_image);
postTitle = (TextView) postView.findViewById(R.id.post_title);
postBody = (TextView) postView.findViewById(R.id.post_body);
}
}
}
XML布局
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.jadebyte.geekng.MainActivity"
tools:showIn="@layout/app_bar_main">
<android.support.v7.widget.RecyclerView
android:id="@+id/post_recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"/>
</RelativeLayout>
答案 0 :(得分:1)
您的问题是您在加载数据之前设置了适配器。 Volley在单独的线程中加载。
更改您的主要活动,如下所示。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Initializing Views
recyclerView = (RecyclerView) findViewById(R.id.post_recycler);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
//Initializing the postlist list
mPostItemsList = new ArrayList<>();
adapter = new PostAdapter(mPostItemsList, this);
recyclerView.setAdapter(adapter);
//Caling method to get data
getData();
//This method will get data from the web api
private void getData(){
//Showing progress dialog
final ProgressDialog progressDialog = ProgressDialog.show(this, "Loading posts", "Please wait", false, false);
//Creating a json request
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(ConfigPost.GET_URL,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
//Dismissing the progress dialog
progressDialog.dismiss();
//calling method to parse json array
parseData(response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
//Creating request queue
RequestQueue requestQueue = Volley.newRequestQueue(this);
//Adding request to the queue
requestQueue.add(jsonArrayRequest);
}
//This method will parse json data
private void parseData(JSONArray array){
for(int i = 0; i<array.length(); i++) {
PostItems postItem = new PostItems();
JSONObject jsonObject = null;
try {
jsonObject = array.getJSONObject(i);
postItem.setPost_image(jsonObject.getString(ConfigPost.TAG_POST_IMAGE));
postItem.setPost_title(jsonObject.getString(ConfigPost.TAG_POST_TITLE));
postItem.setPost_body(jsonObject.getString(ConfigPost.TAG_POST_BODY));
} catch (JSONException w) {
w.printStackTrace();
//Toast.makeText(this, "Error in parsing Json", Toast.LENGTH_LONG).show();
}
mPostItemsList.add(postItem);
}
adapter.notifyDatasetChanged();
}
答案 1 :(得分:0)
无需调用adapter.notifyDataSetChanged()
,因为您要使用整个列表设置适配器。
或者您可以在layoutManager之后初始化适配器,然后更新它。
mPostItemList = new ArrayList<>();
adapter = new PostAdapter(mPostItemsList, this);
然后添加数据调用adapter.notifyDataSetChanged()