简体   繁体   中英

How can I access clicked RecyclerView item position inside fragment?

I have a recyclerView which I display the users completed exercises.

回收站视图

Inside my 'adapter' class, I have method changeIndex() which is used to change the background of the clicked on Item in my RecyclerView to green.

The trouble is I would like call the changeIndex() method from inside my fragment and I do not know the correct way to access the clicked on RecyclerView Item position inside my fragment.

How can this be done?

Adapter


public class CompletedExercisesListAdapter2 extends RecyclerView.Adapter {

    private List<Log_Entries> allCompletedExercises = new ArrayList<>();
    private int row_index = -1;
    private OnItemClickListener listener;
    int presentPosition;
    private ItemClick itemClick;

    public void CompletedExercisesListAdapter2(ItemClick itemClick) {

        this.itemClick=itemClick;
    }

    //STAYS
    public void setExercises(List<Log_Entries> exercises) {
        this.allCompletedExercises = exercises;
        notifyDataSetChanged();
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        View view;


        if (viewType == 0) {
            view = layoutInflater.inflate(R.layout.new_completed_exercise_item, parent, false);
            return new ViewHolderOne(view);
        }

        view = layoutInflater.inflate(R.layout.completed_exercise_item, parent, false);
        return new ViewHolderTwo(view);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

       presentPosition =  position;

        if (getItemViewType(position) == 0) {
            ViewHolderOne viewHolderOne = (ViewHolderOne) holder;

            if (row_index == position) {
                viewHolderOne.relativeLayout.setBackgroundColor(Color.parseColor("#567845"));
            } else {
                viewHolderOne.relativeLayout.setBackgroundResource(R.color.dark_grey);
            }

            viewHolderOne.textViewExerciseName.setText(String.valueOf(allCompletedExercises.get(position).getChildExerciseName()));
            viewHolderOne.textViewSetNumber.setText(String.valueOf(allCompletedExercises.get(position).getSet_number()));
            viewHolderOne.textViewWeight.setText(String.valueOf(allCompletedExercises.get(position).getTotal_weight_lifted()));
            viewHolderOne.textViewReps.setText(String.valueOf(allCompletedExercises.get(position).getReps()));

        } else if (getItemViewType(position) == 1) {
            // bindViewHolder2
            ViewHolderTwo viewHolderTwo = (ViewHolderTwo) holder;

            if (row_index == position) {
                viewHolderTwo.relativeLayout.setBackgroundColor(Color.parseColor("#567845"));
            } else {
                viewHolderTwo.relativeLayout.setBackgroundResource(R.color.dark_grey);
            }

            viewHolderTwo.textViewSetNumber.setText(String.valueOf(allCompletedExercises.get(position).getSet_number()));
            viewHolderTwo.textViewWeight.setText(String.valueOf(allCompletedExercises.get(position).getTotal_weight_lifted()));
            viewHolderTwo.textViewReps.setText(String.valueOf(allCompletedExercises.get(position).getReps()));
        }
    }

    @Override
    public int getItemCount() {
        return allCompletedExercises.size();
    }

    @Override
    public int getItemViewType(int position) {

        // if list is sorted chronologically
        if (position == 0) {
            return 0;
        }
        if (allCompletedExercises.get(position).getChildExerciseName().equals(allCompletedExercises.get(position - 1).getChildExerciseName())) {
            return 1;
        } else {
            return 0;
        }
    }

    class ViewHolderOne extends RecyclerView.ViewHolder {
        private TextView textViewExerciseName;
        private TextView textViewSetNumber;
        private TextView textViewWeight;
        private TextView textViewReps;

        private RelativeLayout relativeLayout;

        public ViewHolderOne(@NonNull View itemView) {
            super(itemView);

            textViewExerciseName = itemView.findViewById(R.id.textView_ExerciseName3);
            textViewSetNumber = itemView.findViewById(R.id.textView_Set_Number56);
            textViewWeight = itemView.findViewById(R.id.textView_weight78);
            textViewReps = itemView.findViewById(R.id.textView_repss0);

            relativeLayout = (RelativeLayout) itemView.findViewById(R.id.exercise_item_relative);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = getAdapterPosition();
                    itemClick.clickItemPosition(getAdapterPosition());
                    if (listener != null && position != RecyclerView.NO_POSITION) {
                        listener.onItemClick(allCompletedExercises.get(position));

                    }
                }
            });
        }
    }

    class ViewHolderTwo extends RecyclerView.ViewHolder {
        private TextView textViewSetNumber;
        private TextView textViewWeight;
        private TextView textViewReps;

        private RelativeLayout relativeLayout;

        public ViewHolderTwo(@NonNull View itemView) {
            super(itemView);
            textViewSetNumber = itemView.findViewById(R.id.textView_Set_Number);
            textViewWeight = itemView.findViewById(R.id.textView_weight);
            textViewReps = itemView.findViewById(R.id.textView_repss);

            relativeLayout = (RelativeLayout) itemView.findViewById(R.id.exercise_item_rel);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = getAdapterPosition();
                    itemClick.clickItemPosition(getAdapterPosition());
                    if (listener != null && position != RecyclerView.NO_POSITION) {
                        listener.onItemClick(allCompletedExercises.get(position));
                    }
                }
            });
        }
    }


    public interface OnItemClickListener {
        void onItemClick(Log_Entries exercises);
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        this.listener = listener;
    }

    public void changeIndex(int rowIndex){
        this.row_index = rowIndex;
        notifyDataSetChanged();
    }

    public interface ItemClick {
        public  void clickItemPosition(int position);
    }

        }

Fragment

public class RecordExerciseFragment extends Fragment implements CompletedExercisesListAdapter2.ItemClick {

    public static final String PARENT_EXERCISE_ID = "-999";
    public static final String EXTRA_DATE = "com.example.exerciseappv4.EXTRA_DATE";
    public static final String EXTRA_WEEK_DATES = "1";
    public static String EXTRA_JUNCTIONID = "EXERCISE_JUNCTION_ID";
    public static int workout_id = 1;
    public static int set_number;

    private EditText editTextWeight;
    private EditText editTextReps;
    private Button saveBtn;
    private Button clearBtn;
    private RecyclerView recyclerView;
    private Button incRepsBtn;
    private Button decRepsBtn;
    private Button incWeightBtn;
    private Button decWeightBtn;
    private TextView dates;

    private LogEntriesViewModel logViewModel;
    private ChildExerciseViewModel childExerciseViewModel;

    int current_junction_id;
    String date = "NULL";
    int firstExerciseID;
    int parentExerciseID;

    int numberOfLogEntries = 0;

    int itemPosition;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.record_exercise_view, container, false);
    }

    public void onViewCreated(View view, Bundle savedInstanceState) {

        editTextWeight = getView().findViewById(R.id.editTextWeight);
        editTextReps = getView().findViewById(R.id.editTextReps);
        saveBtn = getView().findViewById(R.id.save_btn);
        clearBtn = getView().findViewById(R.id.clear_btn);
        incRepsBtn = getView().findViewById(R.id.inc_reps);
        decRepsBtn = getView().findViewById(R.id.dec_reps);
        incWeightBtn = getView().findViewById(R.id.inc_weight);
        decWeightBtn = getView().findViewById(R.id.dec_weight);
        logViewModel = ViewModelProviders.of(this).get(LogEntriesViewModel.class);
        recyclerView = getView().findViewById(R.id.completed_exercise_ListView);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.setHasFixedSize(true);


        Intent intent = getActivity().getIntent();
        if (intent.hasExtra(PARENT_EXERCISE_ID)) {
            parentExerciseID = Integer.parseInt(intent.getStringExtra(PARENT_EXERCISE_ID));
        }

        if (intent.hasExtra(EXTRA_DATE)) {
            date = intent.getStringExtra(EXTRA_DATE);
        }
        if (intent.hasExtra(EXTRA_JUNCTIONID)) {
            current_junction_id = (intent.getIntExtra(EXTRA_JUNCTIONID, -1));
        }


        childExerciseViewModel = ViewModelProviders.of(this).get(ChildExerciseViewModel.class);
        childExerciseViewModel.getChildExerciseIDFromparentID(parentExerciseID).observe(this, this::setChildExerciseID);

        ArrayList<String> THIS_WEEK_DATES = getActivity().getIntent().getStringArrayListExtra(EXTRA_WEEK_DATES);

        Log.i("JUNCTION ID", String.valueOf(current_junction_id));

        final CompletedExercisesListAdapter2 adapter = new CompletedExercisesListAdapter2();
        recyclerView.setAdapter(adapter);

        logViewModel = ViewModelProviders.of(this).get(LogEntriesViewModel.class);

        logViewModel.getAllWorkoutLogEntries(current_junction_id, THIS_WEEK_DATES).observe(this, new Observer<List<Log_Entries>>() {
            @Override
            public void onChanged(List<Log_Entries> exercises) {
                adapter.setExercises(exercises);

                numberOfLogEntries = adapter.getItemCount();

                if (numberOfLogEntries > 0) {
                    recyclerView.smoothScrollToPosition(numberOfLogEntries - 1);
                }
            }
        });


        incWeightBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                double x;

                if (!editTextWeight.getText().toString().matches("")) {
                    x = Double.parseDouble(editTextWeight.getText().toString());
                } else {
                    x = 0;
                }

                x = x + 2.5;
                String y = Double.toString(x);
                editTextWeight.setText(y);
            }
        });

        decWeightBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                double x;
                if (!editTextWeight.getText().toString().matches("")) {
                    x = Double.parseDouble(editTextWeight.getText().toString());
                } else {
                    x = 0;
                }
                x = x - 2.5;
                String y = Double.toString(x);
                editTextWeight.setText(y);
            }
        });

        incRepsBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                int x;
                if (!editTextReps.getText().toString().matches("")) {
                    x = Integer.parseInt(editTextReps.getText().toString());
                } else {
                    x = 0;
                }
                x = x + 1;
                String y = Integer.toString(x);
                editTextReps.setText(y);
            }
        });

        decRepsBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                int x;
                if (!editTextReps.getText().toString().matches("")) {
                    x = Integer.parseInt(editTextReps.getText().toString());
                } else {
                    x = 0;
                }
                x = x - 1;
                String y = Integer.toString(x);
                editTextReps.setText(y);
            }
        });

        clearBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                editTextWeight.setText("0.0");
                editTextReps.setText("0");

            }
        });

        saveBtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                if (editTextWeight.getText().toString().matches("")) {
                    Toast.makeText(getActivity(), "Please Enter a Weight", Toast.LENGTH_SHORT).show();
                    return;
                }
                if (editTextReps.getText().toString().matches("")) {
                    Toast.makeText(getActivity(), "Please Enter Reps", Toast.LENGTH_SHORT).show();
                    return;
                }

                double total_weight = Double.parseDouble(editTextWeight.getText().toString());
                int reps = Integer.parseInt(editTextReps.getText().toString());

                set_number = recyclerView.getAdapter().getItemCount() + 1;

                if (1000 > total_weight && total_weight > 0 && 100 > reps && reps > 0) {

                    workout_id = WorkoutButtonsActivity.buttonClicked;

                    final Toast toast = Toast.makeText(getActivity(), "Added", Toast.LENGTH_SHORT);
                    toast.show();
                    Handler handler = new Handler();
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            toast.cancel();
                        }
                    }, 500);

                    //save log
                    //CHANGE THIS, GET EXERCISE NAME FROM SPINNER
                    final Log_Entries logs = new Log_Entries(current_junction_id, workout_id, total_weight, set_number, reps, date, ((RecordExerciseActivity2) getActivity()).getSelectedExercise());
                    logViewModel.insert(logs);

                    adapter.notifyDataSetChanged();

                } else {
                    Toast.makeText(getActivity(), "Values are not valid", Toast.LENGTH_SHORT).show();
                    return;
                }
                closeKeyboard();
            }
        });


        adapter.setOnItemClickListener(new CompletedExercisesListAdapter2.OnItemClickListener() {
            @Override
            public void onItemClick(Log_Entries exercises) {
                int logId = exercises.getLog_id();
                Toast.makeText(getContext(), String.valueOf(logId), Toast.LENGTH_SHORT).show();
                saveBtn.setText("Update");
                clearBtn.setText("Delete");

//I WOULD LIKE TO USE THE CLICKED RECYCLER VIEW POSITION  HERE
                adapter.changeIndex(itemPosition);

            }
        });
    }

    private void closeKeyboard() {
        View view = getActivity().getCurrentFocus();
        if (view != null) {
            InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }

    private void setChildExerciseID(int childExerciseID) {
        firstExerciseID = childExerciseID;
    }

    @Override
    public void clickItemPosition(int position) {
        itemPosition = position;
    }
}
   /////

You can use the interface

SAMPLE CODE

Create an interface

public interface ItemClick {
    public  void clickItemPosition(int position);
}

Now implement this interface in your Fragment

public class RecordExerciseFragment extends Fragment implements  ItemClick {

@Override
    public void clickItemPosition(int position) {
        // perform your action here
    }

}

now call your adapter like this

final CompletedExercisesListAdapter2 adapter = new CompletedExercisesListAdapter2(this);
        recyclerView.setAdapter(adapter);

Now pass the interface instance in your CompletedExercisesListAdapter2 class

private ItemClick itemClick;
public void CompletedExercisesListAdapter2(ItemClick itemClick) {
       
        this.itemClick=itemClick;
}

Now when you click on recycleiew item just call interface method like this

itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = getAdapterPosition();
                    itemClick.clickItemPosition(getAdapterPosition());
                    if (listener != null && position != RecyclerView.NO_POSITION) {
                        listener.onItemClick(allCompletedExercises.get(position));

                    }
                }
            });

If your fragment has been added your activity there is a short way.

In your activity:

public class TheActivity extends AppCompatActivity {
   public CompletedExercisesListAdapter2 exerciseAdapter;
   public RecyclerView rv;
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_the);
        
        rv = findViewById(R.id.your_rc);
        exerciseAdapter = new CompletedExercisesListAdapter2();
        rv.setAdapter(exerciseAdapter);

    }

}

In your fragment:

public class RecordExerciseFragment extends Fragment implements RecyclerView.OnItemTouchListener{
    RecyclerView rv;

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        if(getActivity() != null){ // Your activity.
            TheActivity connectedActivity = (TheActivity) getActivity();
            rv = connectedActivity.rv;
            rv.addOnItemTouchListener(this);                 
        }

    }

    @Override
    public boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
        int action = e.getAction() & MotionEvent.ACTION_MASK;

        View childView = rv.findChildViewUnder(e.getX(), e.getY());
        int position = childView != null ? rv.getChildAdapterPosition(childView) : -1;

        return false;
    }

    @Override
    public void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {}

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {}

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM