0

アイテムの高さに基づいてアイテムStaggeredGridViewを表示するために使用しています。GridView多くのバージョンで正常に動作しています。しかし、最近、Android 5.1でエラーが表示されることがわかりました。以下のように共有Logcatしています。この問題を解決するのに役立つことを確認してください。

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;
    }
4

1 に答える 1

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
    }

幸運を!

于 2016-06-10T18:36:13.180 に答える