2016-06-03 2 views
0

StaggeredGridView을 사용하여 항목 높이에 따라 GridView 항목을 표시합니다. 많은 버전에서 잘 작동합니다. 하지만, 최근에 나는 안드로이드 5.1에서 오류를 보여주고있는 것으로 나타났습니다. 아래에 Logcat을 공유하고 있습니다. 이 문제를 해결하는 데 도움이되는지 확인해주십시오.int StaggeredGridView의 android.widget.ListAdapter.getCount() 문제

06-03 15:17:22.266: E/AndroidRuntime(29840): java.lang.NullPointerException: Attempt to invoke interface method 'int android.widget.ListAdapter.getCount()' on a null object reference 
06-03 16:03:25.229: E/AndroidRuntime(25195): at com.etsy.android.grid.ExtendableListView.getLastVisiblePosition(ExtendableListView.java:1824) 
06-03 16:03:25.229: E/AndroidRuntime(25195): at android.widget.AdapterView.onInitializeAccessibilityEvent(AdapterView.java:978) 
06-03 16:03:25.229: E/AndroidRuntime(25195): at android.widget.AbsListView.onInitializeAccessibilityEvent(AbsListView.java:1490) 
06-03 16:03:25.229: E/AndroidRuntime(25195): at android.view.View.sendAccessibilityEventUncheckedInternal(View.java:5317) 
06-03 16:03:25.229: E/AndroidRuntime(25195): at android.view.View.sendAccessibilityEventUnchecked(View.java:5304) 
06-03 16:03:25.229: E/AndroidRuntime(25195): at android.view.View$SendViewStateChangedAccessibilityEvent.run(View.java:21039) 
06-03 16:03:25.229: E/AndroidRuntime(25195): at android.os.Handler.handleCallback(Handler.java:739) 
06-03 16:03:25.229: E/AndroidRuntime(25195): at android.os.Handler.dispatchMessage(Handler.java:95) 
06-03 16:03:25.229: E/AndroidRuntime(25195): at android.os.Looper.loop(Looper.java:135) 
06-03 16:03:25.229: E/AndroidRuntime(25195): at android.app.ActivityThread.main(ActivityThread.java:5343) 
06-03 16:03:25.229: E/AndroidRuntime(25195): at java.lang.reflect.Method.invoke(Native Method) 
06-03 16:03:25.229: E/AndroidRuntime(25195): at java.lang.reflect.Method.invoke(Method.java:372) 
06-03 16:03:25.229: E/AndroidRuntime(25195): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) 
06-03 16:03:25.229: E/AndroidRuntime(25195): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700) 

또한 아래와 같은 경고 메시지를 볼 수 있습니다 :

06-03 15:52:05.804: W/art(21986): Before Android 4.1, method void com.etsy.android.grid.ExtendableListView.reportScrollStateChange(int) would have incorrectly overridden the package-private method in android.widget.AbsListView 

내 코드 :

Mainactivity.java

productGridviewAdapter = new ProductGridviewAdapter(getActivity(), productList,); 
gvProducts.setAdapter(productGridviewAdapter); 

ProductGridviewAdapter.java

public ProductGridviewAdapter(Activity a, 
      ArrayList<HashMap<String, String>> arlData) { 

     activity = a; 
     data = arlData; 

     inflater = (LayoutInflater) activity 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     WEBSITE_URL = activity.getResources().getString(R.string.website_url); 

     imageLoader = new ImageLoader(activity.getApplicationContext()); 
    } 

    public int getCount() { 
     return data.size(); 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

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

    static class ViewHolder { 
     ImageView imgPhoto; 
     TextView tvName; 
     TextView tvType; 
     TextView tvDiscountedPrice; 
    } 

    public View getView(int position, final View convertView, ViewGroup parent) { 
     final ViewHolder viewHolder; 

     products = new HashMap<String, String>(); 
     products = data.get(position); 

     View vi = convertView; 
     if (convertView == null) { 
      viewHolder = new ViewHolder(); 

      if (products.get("MRP").equals("0")) { 
       vi = inflater.inflate(R.layout.package_product_item, parent, 
         false); 

       viewHolder.tvType = (TextView) vi.findViewById(R.id.tvType); 
      } else { 
       vi = inflater.inflate(R.layout.product_item, parent, false); 

       viewHolder.tvDiscountedPrice = (TextView) vi 
         .findViewById(R.id.tvDiscountedPrice); 
       viewHolder.tvMRP = (TextView) vi.findViewById(R.id.tvMRP); 
       viewHolder.tvDiscount = (TextView) vi 
         .findViewById(R.id.tvDiscount); 
      } 

      viewHolder.imgPhoto = (ImageView) vi.findViewById(R.id.imgPhoto); 
      viewHolder.tvName = (TextView) vi.findViewById(R.id.tvName); 
      viewHolder.tvOutofStock = (TextView) vi 
        .findViewById(R.id.tvOutofStock); 

      vi.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     imageLoader.DisplayImage(WEBSITE_URL + products.get("Photo"), 
       viewHolder.imgPhoto); 
     viewHolder.tvName.setText(products.get("ProductName")); 

     viewHolder.tvDiscountedPrice.setText(activity.getResources() 
        .getString(R.string.rs) 
        + " " 
        + products.get("DiscountedPrice")); 


     return vi; 
    } 
+0

왜 아래로 투표 하시겠습니까? –

+0

어댑터 코드 –

+0

@ManishJain으로 활동을 게시하십시오. 15 ~ 20 분주세요. –

답변

1

전체 코드가 표시되지 않지만 일부 조건에서 ProductGridviewAdapter 객체에 null 목록이 있다고 말할 수 있습니다. 당신은 당신의 코드를보고 그것이 언제 어디서 일어날지를 찾고 싶다. 목록이 초기화되기 전에 개체가 구성되는 경쟁 조건도주의 깊게 관찰하십시오. 그것은 당신이 관찰하고있는 임의성을 초래할 수 있습니다. 코드에 알려지지 않은 조건을 두는 것을 좋아하지 않지만 어떤 이유로 든 목록이 null이면 비어있는 것으로 간주 할 수 있습니다. 또한 빈 목록으로 초기화하여 시작할 수도 있습니다. 다음 변경 사항은 오류를 없애고 반드시 목록의 근본 원인이 null 일 필요는 없습니다. 그 이유가 다른 (때로는 더 심각한) 문제의 징후가 될 수 있으므로 그 이유를 알아내는 것이 좋습니다.

public ProductGridviewAdapter(Activity a, 
      ArrayList<HashMap<String, String>> arlData) { 

     activity = a; 
     //check for null here as a safety net 
     if (arlData != null) 
      data = arlData; 
     else 
      data = new ArrayList<HashMap<String, String>>(); 
     ... 
    //if somehow data is set to null at some point, treat it as empty list 
    public int getCount() { 
     return data==null?0:data.size(); 
     //alternatively you might want to initialize data in this case 
    } 

행운을 빈다!