2016-04-10 8 views
0

2つのTextViewとImageButton(矢印)を持つCardViewsでRecyclerViewsを設定しています。 JSONからフェッチしている項目にタイトルと抜粋がありますが、抜粋が長すぎるため、矢印ボタンをクリックすると折りたたまれ(View.GONE)、展開します(View.VISIBLE)。私が抱えている問題は、アプリケーションがNull Pointer Exceptionでクラッシュしていることです。RecyclerViewのItemに対してonClickリスナーを実装しようとするとNPEが発生する

MainActivity

public class MainActivity extends AppCompatActivity { 

    private final String TAG = "MainActivity"; 

    ImageButton arrowbutton; 
    TextView news_excerpt; 

    //Creating a list of newss 
    private List<NewsItems> mNewsItemsList; 

    //Creating Views 
    private RecyclerView recyclerView; 
    private RecyclerView.Adapter adapter; 
    private ProgressDialog mProgressDialog; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     //Initializing Views 
     recyclerView = (RecyclerView) findViewById(R.id.news_recycler); 
     LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
     recyclerView.setLayoutManager(layoutManager); 


     //Initializing the newslist 
     mNewsItemsList = new ArrayList<>(); 
     adapter = new NewsAdapter(mNewsItemsList, this); 

     recyclerView.setAdapter(adapter); 

     arrowbutton = (ImageButton) findViewById(R.id.arrow_button); 
     news_excerpt = (TextView) findViewById(R.id.news_body); 
     arrowbutton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       int visibilty = news_excerpt.getVisibility(); 
       if (visibilty == View.VISIBLE) { 
        news_excerpt.setVisibility(View.GONE); 
       } else { 
        news_excerpt.setVisibility(View.VISIBLE); 
       } 
      } 
     }); 





     if (NetworkCheck.isAvailableAndConnected(this)) { 

      //Caling method to get data 
      getData(); 
     } else { 
      final Context mContext; 
      mContext = this; 
      final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); 
      alertDialogBuilder.setTitle(R.string.alert_titl); 
      alertDialogBuilder.setCancelable(false); 
      alertDialogBuilder.setIcon(R.mipmap.ic_launcher); 
      alertDialogBuilder.setMessage(R.string.alert_mess); 
      alertDialogBuilder.setPositiveButton(R.string.alert_retry, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        if (!NetworkCheck.isAvailableAndConnected(mContext)) { 
         alertDialogBuilder.show(); 
        } else { 
         getData(); 
        } 

       } 
      }); 
      alertDialogBuilder.setNegativeButton(R.string.alert_cancel, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        finish(); 

       } 
      }); 
      alertDialogBuilder.show(); 


     } 


    //This method will get data from the web api 

    private void getData(){ 


     Log.d(TAG, "getData called"); 
     //Showing progress dialog 
     mProgressDialog = new ProgressDialog(MainActivity.this); 
     mProgressDialog.setCancelable(false); 
     mProgressDialog.setMessage(this.getResources().getString(R.string.load_news)); 
     mProgressDialog.show(); 


     //Creating a json request 
     JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(ConfigNews.GET_URL, 
       new Response.Listener<JSONArray>() { 
        @Override 
        public void onResponse(JSONArray response) { 
         Log.d(TAG, "onResponse called"); 
         //Dismissing the progress dialog 
         if (mProgressDialog != null) { 
          mProgressDialog.hide(); 
         } 
         /*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){ 
     Log.d(TAG, "Parsing array"); 

     for(int i = 0; i<array.length(); i++) { 
      NewsItems newsItem = new NewsItems(); 
      JSONObject jsonObject = null; 
      try { 
       jsonObject = array.getJSONObject(i); 
       newsItem.setNews_title(jsonObject.getString(ConfigNews.TAG_VIDEO_TITLE)); 
       newsItem.setNews_body(jsonObject.getString(ConfigNews.TAG_VIDEO_BODY)); 


      } catch (JSONException w) { 
       w.printStackTrace(); 
      } 
      mNewsItemsList.add(newsItem); 


     } 

     adapter.notifyItemRangeChanged(0, adapter.getItemCount()); 


    } 


    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Log.d(TAG, "onDestroy called"); 
     if (mProgressDialog != null){ 
      mProgressDialog.dismiss(); 
      Log.d(TAG, "mProgress dialog dismissed"); 

     } 
    } 

} 

アダプタ

public class NewsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{ 

    private ImageLoader imageLoader; 
    private Context mContext; 

    //List of newss 
    private List<NewsItems> mNewsItems; 

    private final int VIEW_ITEM = 0; 
    private final int VIEW_PROG = 1; 

    public NewsAdapter(List<NewsItems> newsItems, Context context) { 
     super(); 

     //Getting all newss 
     this.mNewsItems = newsItems; 
     this.mContext = context; 
    } 

    @Override 
    public int getItemViewType(int position) { 
     if (isPositionItem(position)) 
      return VIEW_ITEM; 
     return VIEW_PROG; 
    } 

    private boolean isPositionItem(int position) { 
     return position != getItemCount()-1; 
    } 



    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder (ViewGroup parent, int viewType) { 
     if (viewType == VIEW_ITEM) { 
      View v = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.news_summ, parent, false); 
      return new TextViewHolder(v); 
     } else if (viewType == VIEW_PROG){ 
      View v = LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.recyclerfooter, parent, false); 
      return new ProgressViewHolder(v); 
     } 

     return null; 
    } 



    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     if (holder instanceof TextViewHolder) { 
      NewsItems newsList = mNewsItems.get(position); 
      ((TextViewHolder) holder).newsTitle.setText(newsList.getNews_title()); 
      ((TextViewHolder) holder).newsBody.setText(newsList.getNews_body()); 

     } else { 
      ((ProgressViewHolder) holder).progressBar.setIndeterminate(true); 
      ((ProgressViewHolder) holder).loadButton.setText(R.string.reload); 
     } 


    } 


    @Override 
    public int getItemCount(){ 
     //Return the number of items in the data set 
     return mNewsItems.size(); 
    } 



    public static class TextViewHolder extends RecyclerView.ViewHolder{ 
     public TextView newsTitle, newsBody; 

     TextViewHolder (View newsView) { 
      super(newsView); 
      newsTitle = (TextView) newsView.findViewById(R.id.news_title); 
      newsBody = (TextView) newsView.findViewById(R.id.news_body); 



     } 
    } 

    public static class ProgressViewHolder extends RecyclerView.ViewHolder { 
     Button loadButton; 
     ProgressBar progressBar; 

     public ProgressViewHolder(View footerView){ 
      super(footerView); 
      loadButton = (Button) footerView.findViewById(R.id.reload_button); 
      progressBar = (ProgressBar) footerView.findViewById(R.id.progress_load); 
     } 
    } 


} 

スタックトレース

04-10 12:54:05.683 25474-25474/com.ozuf.newsusa E/AndroidRuntime: FATAL EXCEPTION: main 
                    Process: com.ozuf.newsusa, PID: 25474 
                    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ozuf.newsusa/com.ozuf.newsusa.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageButton.setOnClickListener(android.view.View$OnClickListener)' on a null object reference 
                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2695) 
                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2769) 
                     at android.app.ActivityThread.access$900(ActivityThread.java:177) 
                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1430) 
                     at android.os.Handler.dispatchMessage(Handler.java:102) 
                     at android.os.Looper.loop(Looper.java:135) 
                     at android.app.ActivityThread.main(ActivityThread.java:5910) 
                     at java.lang.reflect.Method.invoke(Native Method) 
                     at java.lang.reflect.Method.invoke(Method.java:372) 
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200) 
                     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageButton.setOnClickListener(android.view.View$OnClickListener)' on a null object reference 
                     at com.ozuf.newsusa.MainActivity.onCreate(MainActivity.java:109) 
                     at android.app.Activity.performCreate(Activity.java:6178) 
                     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2648) 
                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2769)  
                     at android.app.ActivityThread.access$900(ActivityThread.java:177)  
                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1430)  
                     at android.os.Handler.dispatchMessage(Handler.java:102)  
                     at android.os.Looper.loop(Looper.java:135)  
                     at android.app.ActivityThread.main(ActivityThread.java:5910)  
                     at java.lang.reflect.Method.invoke(Native Method)  
                     at java.lang.reflect.Method.invoke(Method.java:372)  
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405)  
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)  

スタックトレースから、 arrowbutton.setOnClickListener()に沿っMainActivityでarrowbutton.setOnClickListener(new View.OnClickListener() {行目に109 coressponds

+0

ポストレイアウトactivity_main.xml –

+0

@Amitグプタhttp://stackoverflow.com/a/30285361/4252352 –

+0

@Amit、 'arrowbutton'と' news_excerpt'は 'activity_main.xml'にはありません。彼らは私が 'NewsAdapter'で膨らませた' post_summ'レイアウトにあります – X09

答えて

0

ラインは、間違った場所に追加されました。ビューにR.id.arrow_buttonコントロールが含まれておらず、(ImageButton) findViewById(R.id.arrow_button)返信null

あなたは(あなたはrecycleview項目が矢印のImageButtonが含まれていると述べた)NewsAdapterの項目ホルダーのコンストラクタにsetOnClickListener()を移動する必要があります。

public static class TextViewHolder extends RecyclerView.ViewHolder{ 
    public TextView newsTitle, newsBody; 
    public ImageButton arrowbutton; 

    TextViewHolder (View newsView) { 
     super(newsView); 
     newsTitle = (TextView) newsView.findViewById(R.id.news_title); 
     newsBody = (TextView) newsView.findViewById(R.id.news_body); 
     arrowbutton = (ImageButton) findViewById(R.id.arrow_button); 

     arrowbutton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       int visibilty = newsBody.getVisibility(); 
       if (visibilty == View.VISIBLE) { 
        newsBody.setVisibility(View.GONE); 
       } else { 
        newsBody.setVisibility(View.VISIBLE); 
       } 
      } 
     });   
    } 
} 
+0

Plsあなたは私があなたがplsを意味する例を教えてくれますか? – X09

+0

@Ozuf、私は答えを変更しました –

+0

ありがとうございました、Mark Keenも答えへのリンクを提供しました。 – X09

0

news_excerptarrowbuttonビューがないときに私が作った間違いはMainActivityにクリックリスナを追加しましたactivity_main.xmlで、それはPostAdapterにあるはずです。 Alexandr Shutko、これを私に指摘してくれてありがとう。 Mark Keen、答えへのリンクを提供してくれてありがとう。

だから、これは私がそれを

をしたかである私は完全にMainActivityから

arrowbutton = (ImageButton) findViewById(R.id.arrow_button); 
     news_excerpt = (TextView) findViewById(R.id.news_body); 
     arrowbutton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       int visibilty = news_excerpt.getVisibility(); 
       if (visibilty == View.VISIBLE) { 
        news_excerpt.setVisibility(View.GONE); 
       } else { 
        news_excerpt.setVisibility(View.VISIBLE); 
       } 
      } 
     }); 

を取り除き、NewsAdapterに置きます。 NewsAdapter

は、私はこのようTextViewHolder ViewHolder修飾:

public static class TextViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     public TextView newsTitle, newsBody; 
     public ImageButton arrowbutton; 


     public TextViewHolder (final View newsView) { 
      super(newsView); 
      newsTitle = (TextView) newsView.findViewById(R.id.news_title); 
      newsBody = (TextView) newsView.findViewById(R.id.news_body); 
      arrowbutton = (ImageButton) newsView.findViewById(R.id.arrow_button); 

      arrowbutton.setOnClickListener(this); 

     } 

     @Override 
       public void onClick(View v) { 
        if (v.getId() == arrowbutton.getId()) { 
         int visibilty = news_body.getVisibility(); 
         if (visibilty == View.VISIBLE) { 
         news_body.setVisibility(View.GONE); 
         } else { 
           news_body.setVisibility(View.VISIBLE); 
          } 
        } 
       } 
    } 
関連する問題