2016-08-23 65 views
1

我已经实现了一个名为CSnackBar的类,它包含Snackbar实现,并且我有一个名为“A”的Activity,其中包含listview并使其适配器知道为“A Adapter”我已经在Adapter类中实现了单击事件...场景就像在点击列表视图项目我想检查互联网是否可用如果是的话,然后想要导航到另一个活动,如果没有,那么要显示快餐栏消息.....但是当我试图显示零食吧信息从适配器其给我的错误: -如何在活动中显示Snackbar消息?

小吃吧类: -

private static CSnackBar s_m_oCSnackBar;// declare snack bar variable 

    public static CSnackBar getInstance() {// creating Instance of nack bar 
     if (s_m_oCSnackBar == null) { 
      s_m_oCSnackBar = new CSnackBar(); 
      } 
     return s_m_oCSnackBar; 
     } 

    public void showSnackBarError(View v, String message, Context context) { 
     // parametrised constructor 

     Snackbar snack = Snackbar.make(v, "" + message, Snackbar.LENGTH_SHORT); 
     View view = snack.getView(); 
     TextView tv = (TextView) view.findViewById(android.support.design.R.id.snackbar_text); 
     tv.setTextColor(Color.WHITE); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) 
      tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 
     else 
      tv.setGravity(Gravity.CENTER_HORIZONTAL); 
     ColoredSnackbar.alert(snack).show(); 
    } 

    public void showSnackBarSuccess(View v, String message, Context context) { 

     Snackbar snack = Snackbar.make(v, "" + message, Snackbar.LENGTH_SHORT); 
     View view = snack.getView(); 
     TextView tv = (TextView) view.findViewById(android.support.design.R.id.snackbar_text); 
     tv.setTextColor(Color.WHITE); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) 
      tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER); 
     else 
      tv.setGravity(Gravity.CENTER_HORIZONTAL); 
     ColoredSnackbar.confirm(snack).show(); 
    } 


Adapter class code for Onclick:- 

    private final Context m_Context;// declaring context variable 
    private final ArrayList<CDealAppDatastorage> s_oDataset;// declaring array list ariable 

    public CDealAppListingAdapter(Context m_Context, ArrayList<CDealAppDatastorage> mDataList) { 
     this.m_Context = m_Context; 
     s_oDataset = mDataList; 
    } 

    @Override 
    public int getCount() {// get total arraylist size 
     return s_oDataset.size(); 
    } 

    @Override 
    public Object getItem(int position) {// get item position in array list 
     return s_oDataset.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @SuppressLint({"SetTextI18n", "InflateParams"}) 
    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     final ViewHolder viewHolder; 
     if (convertView == null) { 
      viewHolder = new ViewHolder(); 
      convertView = inflater.inflate(R.layout.deallisting_card_view, null); 
      viewHolder.m_Header = (TextView) convertView.findViewById(R.id.headingText); 
      viewHolder.m_Subheader = (TextView) convertView.findViewById(R.id.subHeaderText); 
      viewHolder.m_DummyText = (TextView) convertView.findViewById(R.id.subHeadingText); 
      viewHolder.m_logoImage = (ImageView) convertView.findViewById(R.id.appImage); 
      viewHolder.m_getBtn = (Button) convertView.findViewById(R.id.getDealBtn); 
      convertView.setTag(viewHolder); 

     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 
     viewHolder.m_getBtn.setOnClickListener(new View.OnClickListener() {// onclick getDeal Btn 
      @Override 
      public void onClick(View v) {//send to deal detail page onclick getDeal Btn 
       if (NetworkUtil.isConnected(m_Context)){ 
        Intent i = new Intent(v.getContext(), CDealAppListingDetails.class); 
        i.putExtra("DealCode", s_oDataset.get(position).getM_szsubHeaderText());// get deal code from deal data storage 
        i.putExtra("headerText", s_oDataset.get(position).getM_szHeaderText());// get deal name from deal dta storage 
        v.getContext().startActivity(i); 
       }else { 
        /*here I am getting error*/CSnackBar.getInstance().showSnackBarError(v.findViewById(R.id.mainLayout),"No Internet connection available",m_Context); 
       } 

      } 
     }); 
     CDealAppDatastorage m = s_oDataset.get(position); 
     viewHolder.m_Header.setText(m.getM_szHeaderText()); 
     viewHolder.m_Subheader.setText(m.getM_szsubHeaderText()); 
     viewHolder.m_getBtn.setText("GET " + m.getM_szDealValue() + " POINTS");// set deal button text 
     viewHolder.m_logoImage.setImageResource(m.getM_n_Image());// set deal logo 

     String source = "Dummy text is text that is used in the publishing industry or by web designers to occupy space."; 
     viewHolder.m_DummyText.setText(Html.fromHtml(source)); 

     return convertView; 
    } 

    private class ViewHolder { 
     public TextView m_Header, m_Subheader, m_DummyText; 
     public ImageView m_logoImage; 
     public Button m_getBtn; 
    } 
} 

这里是日志错误: -

Process: com.example.devui1.rewardapp, PID: 11205 
java.lang.NullPointerException 
at android.support.design.widget.Snackbar.<init>(Snackbar.java:188) 
at android.support.design.widget.Snackbar.make(Snackbar.java:220) 
at com.example.devui1.rewardapp.snackbar.CSnackBar.showSnackBarError(CSnackBar.java:26) 
at com.example.devui1.rewardapp.adapter.CDealAppListingAdapter$1.onClick(CDealAppListingAdapter.java:78) 
+0

添加错误日志也 –

+0

看到设置布局以上......................... – Raghav

+0

只在快餐栏中尝试'v'而不是'findViewById' –

回答

2

此行是你的问题

/*here I am getting error*/CSnackBar.getInstance().showSnackBarError(v.findViewById(R.id.mainLayout),"No Internet connection available",m_Context); 

变量v代表Button你点击。 A Button并非来自ViewGroup,因此它不能有任何孩子。因此findViewById将返回null,您将传入make函数SnackBar。如果你想通过主要布局,你必须到该行改变这个

CSnackBar.getInstance().showSnackBarError(findViewById(R.id.mainLayout),"No Internet connection available",m_Context); 

这将尝试找到ID mainLayout一个View在您setContentView