代码之家  ›  专栏  ›  技术社区  ›  Code Lover

在空对象引用上设置SetonItemClickListener

  •  0
  • Code Lover  · 技术社区  · 7 年前

    我有两个碎片 side by side 加入 MainActivity LeftFragment 有一个 RecyclerView 具有 colors 我想在屏幕上设置背景色和文字 Right Fragment 当点击屏幕上的任何颜色时 左片段

    应用程序因错误而崩溃 null object reference 错误

    这是我的 Github Repo .但是,添加一些代码以供参考。

    左片段

    public class LeftFragment extends Fragment {
    
        public LeftFragment() {
            // Required empty public constructor
        }
    
        public static LeftFragment newInstance() {
            return new LeftFragment();
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            View view = inflater.inflate(R.layout.fragment_left, container, false);
    
            //    private OnColorChooseListener mOnColorChooseListener;
            ArrayList<Color> mColor = new ArrayList<>();
    
            mColor.add(new Color(getResources().getColor(R.color.colorRed), getResources().getString(R.string.red)));
            mColor.add(new Color(getResources().getColor(R.color.colorOrange), getResources().getString(R.string.orange)));
            mColor.add(new Color(getResources().getColor(R.color.colorYellow), getResources().getString(R.string.yellow)));
            mColor.add(new Color(getResources().getColor(R.color.colorLime), getResources().getString(R.string.lime)));
            mColor.add(new Color(getResources().getColor(R.color.colorGreen), getResources().getString(R.string.green)));
            mColor.add(new Color(getResources().getColor(R.color.colorCyan), getResources().getString(R.string.cyan)));
            mColor.add(new Color(getResources().getColor(R.color.colorBlue), getResources().getString(R.string.blue)));
            mColor.add(new Color(getResources().getColor(R.color.colorIndigo), getResources().getString(R.string.indigo)));
            mColor.add(new Color(getResources().getColor(R.color.colorViolet), getResources().getString(R.string.violet)));
    
            RecyclerView mRecyclerView = view.findViewById(R.id.color_list_view);
            RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
            RecyclerView.Adapter mAdapter = new ColorAdapter(mColor, getActivity());
            mRecyclerView.setLayoutManager(mLayoutManager);
            mRecyclerView.setAdapter(mAdapter);
    
            return view;
        }
    
    }
    

    右片段

    public class RightFragment extends Fragment {
    
        ColorAdapter     colorAdapter;
        ArrayList<Color> color;
    
        public RightFragment() {
            // Required empty public constructor
        }
    
        public static RightFragment newInstance() {
            return new RightFragment();
        }
    
    
        @Override
        public View onCreateView(
                LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState
        ) {
            // Inflate the layout for this fragment
            View view = inflater.inflate(R.layout.fragment_right, container, false);
    
            final ConstraintLayout constraintLayout = view.findViewById(R.id.right_color_block);
            final TextView         textView         = view.findViewById(R.id.right_color_text);
    
            colorAdapter.SetItemClickListener(new ColorAdapter.OnItemClickListener() {
                @Override
                public void OnItemClick(int position) {
                    constraintLayout.setBackgroundColor(color.get(position).getmColor());
                    textView.setText(color.get(position).getmLabel());
                }
            });
    
            return view;
        }
    
    }
    

    颜色适配器(RecyclerView)

    public class ColorAdapter extends RecyclerView.Adapter<ColorAdapter.ColorViewHolder> {
    
        private List<Color>         mColor;
        private Context             mContext;
        private OnItemClickListener mOnItemClickListener;
    
        public ColorAdapter(List<Color> mColor, Context mContext) {
            this.mColor = mColor;
            this.mContext = mContext;
        }
    
        public void SetItemClickListener(OnItemClickListener listener) {
            this.mOnItemClickListener = listener;
        }
    
        @NonNull
        @Override
        public ColorViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
            View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.color_list_item, viewGroup, false);
            return new ColorViewHolder(view, mOnItemClickListener);
        }
    
        @Override
        public void onBindViewHolder(@NonNull final ColorViewHolder colorViewHolder, final int i) {
    
            final Color color = mColor.get(i);
    
            colorViewHolder.itemColorText.setText(color.getmLabel());
            colorViewHolder.itemColorText.setBackgroundColor(color.getmColor());
    
            colorViewHolder.itemColorText.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(mContext, "Item clicked: " + i, Toast.LENGTH_SHORT).show();
    //                colorViewHolder.feedbackBlock.setBackgroundColor(color.getmColor());
                    colorViewHolder.feedbackText.setText(color.getmLabel());
                }
            });
    
        }
    
        @Override
        public int getItemCount() {
            return mColor.size();
        }
    
        public interface OnItemClickListener {
            void OnItemClick(int position);
        }
    
        class ColorViewHolder extends RecyclerView.ViewHolder {
    
            public ConstraintLayout itemColorBlock;
            public TextView         itemColorText;
            public ConstraintLayout feedbackBlock;
            public TextView         feedbackText;
    
            public ColorViewHolder(@NonNull View itemView, final OnItemClickListener listener) {
                super(itemView);
    
                itemColorBlock = itemView.findViewById(R.id.color_block);
                itemColorText = itemView.findViewById(R.id.color_text);
                feedbackBlock = itemView.findViewById(R.id.right_color_block);
                feedbackText = itemView.findViewById(R.id.right_color_text);
    
                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        if (listener != null) {
                            int position = getAdapterPosition();
    
                            if (position != RecyclerView.NO_POSITION) {
                                listener.OnItemClick(position);
                            }
                        }
                    }
                });
    
            }
        }
    
    }
    

    颜色

    public class Color {
    
        private int mColor;
        private String mLabel;
    
        public Color(@ColorInt int color, String label) {
            this.mColor = color;
            this.mLabel = label;
        }
    
        public String getmLabel() {
            return mLabel;
        }
    
        public void setmLabel(String mLabel) {
            this.mLabel = mLabel;
        }
    
        public int getmColor() {
            return mColor;
        }
    
        public void setmColor(@ColorInt int mColor) {
            this.mColor = mColor;
        }
    
        @NonNull
        @Override
        public String toString() {
            return super.toString();
        }
    }
    

    主要活动

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            LeftFragment leftFragment = LeftFragment.newInstance();
            getSupportFragmentManager().beginTransaction().replace(R.id.left_container, leftFragment).commit();
    
            RightFragment rightFragment = RightFragment.newInstance();
            getSupportFragmentManager().beginTransaction().replace(R.id.right_container, rightFragment).commit();
    
        }
    
    }
    
    0 回复  |  直到 7 年前
        1
  •  0
  •   Amir jodat    7 年前

    你的应用程序在RightFragment上崩溃。类,因为您正在调用colorAdapter。SetItemClickListener(第43行)与**RightFragment colorAdapteris null**中一样,您在不同的片段上设置适配器,并在不同的片段上实现侦听器,所以这就是发生此崩溃的原因。

    你可以在LeftFragment(你最初设置适配器的地方)上应用这个监听器,点击它(在监听器回调中),你可以打开right fragment(将所选数据从LeftFragment发送到RightFragment), This SO Answer can help you in this ,当right fragment打开时,您将获得选定的颜色数据,您可以在RightFragment上使用它。

    推荐文章