2016-03-30 15 views
-1

この質問で“RecyclerView: No Adapter attached; skipping layout” for recyclerview RecyclerViewの使用中に「アダプタが接続されず、レイアウトをスキップしています」というエラーが表示されました。私はその問題を解決しなかったこともあって、私はAndroid Studioで過ごしました。そのプロセス中に私はRecyclerViewクラスを開き、そのエラーが表示される唯一の条件はアダプタがnullの場合です。アダプタを初期化して接続しました。私はGoogleを検索して検索しました。解決策はありません。RecyclerViewでアダプタがnullの場合

初期化をonCreateメソッドに移動すると、アプリケーションが完全にクラッシュすることはわかりません。

私の質問は次のとおりです:RecyclerViewでアダプタがヌルになっていますが、何が問題の解決策ですか?

緑色の開発者を助けてください。これは私の最初のアプリです。 ご意見をお待ちしております。

私はalseこの試みている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

はあなたのコードを表示します! –

+0

私はそのリンクの質問にコードを追加しました。その理由は私がここでそれをしなかった理由です。繰り返しのために。私はここにそれを追加しました。 – Faraday

+0

どこでmPostItemsListを初期化しますか? –

答えて

1

あなたの問題は、データがロードされる前に、アダプタを設定しているということです。バレーは別のスレッドで読み込まれます。

あなたの主な活動を以下のように変更してください。

@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(); 


} 
+0

私は質問にコードを追加した、私はレイアウトマネージャを設定する前に、アダプタを設定します。 – Faraday

+0

mPostItemListを初期化しましたか? –

+0

はい、LayoutManagerを設定した後です。私はすべての不足しているコードを追加しました。 Plsそれを確認します。 – Faraday

0

adapter.notifyDataSetChanged()を呼び出す必要はありません。リスト全体でアダプタを設定しているためです。 または、layoutManagerの後にアダプタを初期化してから更新することができます。

mPostItemList = new ArrayList<>(); 
adapter = new PostAdapter(mPostItemsList, this); 

は、データの呼び出しを追加した後adapter.notifyDataSetChanged()

関連する問題