SetonItemClickListener для нулевой ссылки на объект - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть два фрагмента side by side в MainActivity LeftFragment имеет RecyclerView с colors, и я хочу установить цвет фона и текста на Right Fragment при нажатии на любой цвет наLeftFragment

Приложение вылетает с ошибкой null object reference error.

Вот мой 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;
    }

}

ColorAdaptor (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();
    }
}

MainActivity

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();

    }

}

1 Ответ

0 голосов
/ 23 февраля 2019

Сбой вашего приложения в RightFragment.class, потому что вы вызываете colorAdapter.SetItemClickListener (в строке 43), как в ** RightFragment colorAdapteris null **, вы устанавливаете адаптер для другого фрагмента и реализуете прослушиватель для другого, поэтомуавария случается.

Вы можете применить этот слушатель к LeftFragment (где вы изначально установили адаптер), и по щелчку этого (в обратном вызове слушателя) вы можете открыть правый фрагмент (отправить выбранные данные из LeftFragment в RightFragment), This SOОтвет может помочь вам в этом , когда откроется правый фрагмент, вы получите данные выбранного цвета, и здесь вы можете использовать их на RightFragment.

...