0

アプリケーションにカスタム グリッド ビューを実装しました。StaggeredGridView を使用しています。コードに実装することはできますが、グリッド ビューをスクロールしようとすると、mScrollListener nullを 取得しているため、アプリケーションがクラッシュします。スクロール リスナーが null 値を取得する方法。

これが私のコードです:

public class CompareSelectorGridFragments extends Fragment {
    private List<StaggeredGridViewItem> itemlist;
    private List<catagoriesListModal> _categories;
    private StaggeredGridView mStaggeredView;
    private View mRootView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Session.ChangeFragmentOnBackPressHandlerWithBack(null, null, "", 0);
        Session.getmCountImage().setvisibilityOff();
        itemlist = new ArrayList<StaggeredGridViewItem>();
        mRootView = inflater.inflate(
                R.layout.fragment_product_selector_for_compare, container,
                false);
        if (getResources().getBoolean(R.bool.landscape_only)) {
            getActivity().setRequestedOrientation(
                    ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        } else {
            getActivity().setRequestedOrientation(
                    ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
        initUI(mRootView);
        return mRootView;
    }

    private void initUI(View rootView) {
        mStaggeredView = new StaggeredGridView(getActivity());
        mStaggeredView.initialize(3, StaggeredGridView.Mode.FIXED);
        mStaggeredView.setOnScrollListener(scrollListener);
        mStaggeredView = (StaggeredGridView) rootView
                .findViewById(R.id.grid_product_selector);
        StaggeredGridViewItem item = null;
        for (int i = 0; i < DummyData.getSelectorList().size(); i++) {
            _categories = DummyData.getSelectorList().get(i).getCategories();
            item = new ProductSelectorCompareAdapter(getActivity(), DummyData
                    .getSelectorList().get(i).getName(), DummyData
                    .getSelectorList().get(i).getImage(), _categories);

            itemlist.add(item);

        }
        mStaggeredView.addItemsList(itemlist);

    }

    private OnScrollListener scrollListener = new OnScrollListener() {
        public void onTop() {
        }

        public void onScroll() {

        }

        public void onBottom() {
        }
    };

}

アダプターのコードは次のとおりです。

public class SelectorCompareAdapter extends StaggeredGridViewItem {

    Activity activity;
    List<SelectorTest> listSelector;
    private Button btn;
    List<catagoriesListModal> mCategories;
    private View mView;
    private int mHeight;
    private String Name;
    private int Image;

    public SelectorCompareAdapter(Activity activity, String name,
            int image, List<catagoriesListModal> _categories) {
        this.activity = activity;
        this.Name = name;
        this.Image = image;
        this.mCategories = _categories;
    }

    static class ViewHolder {
        TextView tvProductName;
        ImageView imgView;
        View viewRightLine;
        ScrollView scrlLstItems;
        LinearLayout lnrLayout;
    }

    @Override
    public View getView(LayoutInflater inflater, ViewGroup parent) {
        final ViewHolder viewHolder;
        mView = inflater.inflate(R.layout.selector_item_compare, null);
        if (mView != null) {
            viewHolder = new ViewHolder();
            viewHolder.tvProductName = (TextView) mView
                    .findViewById(R.id.tv_product);
            viewHolder.imgView = (ImageView) mView
                    .findViewById(R.id.img_product);
            viewHolder.viewRightLine = (View) mView
                    .findViewById(R.id.view_right_line);
            viewHolder.lnrLayout = (LinearLayout) mView
                    .findViewById(R.id.lnr_test);
            viewHolder.tvProductName.setText(Name);
            viewHolder.imgView.setImageResource(Image);
            viewHolder.imgView.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    viewHolder.lnrLayout.setVisibility(View.VISIBLE);
                    viewHolder.imgView.setVisibility(View.GONE);
                    for (int i = 0; i < mCategories.size(); i++) {

                        btn = new Button(activity);
                        btn.setText(mCategories.get(i).getName());

                        viewHolder.lnrLayout.addView(btn);
                        int idx = viewHolder.lnrLayout.indexOfChild(btn);
                        btn.setTag(Integer.toString(idx));

                        btn.setOnClickListener(new OnClickListener() {

                            @Override
                            public void onClick(View v) {
                                String idxStr = (String) v.getTag();
                                Toast.makeText(activity, idxStr,
                                        Toast.LENGTH_SHORT).show();

                            }
                        });
                    }
                }
            });
            viewHolder.tvProductName.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    if (activity.getResources().getBoolean(
                            R.bool.landscape_only)) {
                        viewHolder.lnrLayout.removeAllViews();
                        viewHolder.lnrLayout.setVisibility(View.GONE);
                        viewHolder.imgView.setVisibility(View.VISIBLE);
                    }

                }
            });
            mView.setTag(viewHolder);

        } else {
            viewHolder = (ViewHolder) mView.getTag();
        }
        return mView;
    }

    @Override
    public int getViewHeight(LayoutInflater inflater, ViewGroup parent) {
        LinearLayout item_containerLinearLayout = (LinearLayout) mView
                .findViewById(R.id.ll_container);
        item_containerLinearLayout.measure(MeasureSpec.UNSPECIFIED,
                MeasureSpec.UNSPECIFIED);
        mHeight = item_containerLinearLayout.getMeasuredHeight();
        return mHeight;
    }
}

ログ エラー :-

08-31 08:37:28.946: E/AndroidRuntime(5076): java.lang.NullPointerException
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at com.mss.skyjack.customgridview.StaggeredGridView.onScrollChanged(StaggeredGridView.java:243)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.View.scrollTo(View.java:10210)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.widget.ScrollView.onOverScrolled(ScrollView.java:763)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.View.overScrollBy(View.java:16879)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.widget.ScrollView.onTouchEvent(ScrollView.java:634)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.View.dispatchTouchEvent(View.java:7384)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2205)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1940)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1954)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1954)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1954)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1954)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1954)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1954)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1954)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1954)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2211)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1954)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1966)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1418)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.app.Activity.dispatchTouchEvent(Activity.java:2424)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.support.v7.internal.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:59)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1914)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.View.dispatchPointerEvent(View.java:7564)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3883)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3778)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3483)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3540)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5419)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5399)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5370)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5493)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:182)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:174)
08-31 08:37:28.946: E/AndroidRuntime(5076): 	at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImp

4

1 に答える 1

1

または、 findViewById 呼び出しの後に setScrollListener を呼び出してみてください

于 2015-08-31T12:36:39.420 に答える