Android 如何访问片段内单击的RecyclerView项位置?

Android 如何访问片段内单击的RecyclerView项位置?,android,android-fragments,android-recyclerview,Android,Android Fragments,Android Recyclerview,我有一个recyclerView,显示用户完成的练习 在我的“adapter”类中,我有一个方法changeIndex(),用于将我的RecyclerView中单击项目的背景更改为绿色 问题是我想从片段内部调用changeIndex()方法,但我不知道访问片段中单击的RecyclerView项位置的正确方法 如何做到这一点 适配器 public class CompletedExercisesListAdapter2 extends RecyclerView.Adapter { p

我有一个
recyclerView
,显示用户完成的练习

在我的“adapter”类中,我有一个方法
changeIndex()
,用于将我的
RecyclerView
中单击项目的背景更改为绿色

问题是我想从片段内部调用
changeIndex()
方法,但我不知道访问片段中单击的RecyclerView项位置的正确方法

如何做到这一点

适配器


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

        }


公共类CompletedExercisesListAdapter2扩展了RecyclerView.Adapter{
private List allCompletedExercises=new ArrayList();
private int row_index=-1;
私人监听;
int当前位置;
私人物品点击物品点击;
public void CompletedExercisesListAdapter2(项目单击项目单击){
this.itemClick=itemClick;
}
//停留
公开练习(列表练习){
this.allCompletedExercises=练习;
notifyDataSetChanged();
}
@非空
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
LayoutInflater LayoutInflater=LayoutInflater.from(parent.getContext());
视图;
如果(viewType==0){
视图=布局更平坦。充气(R.layout.new\u completed\u exercise\u item,parent,false);
返回新的ViewHolderOne(视图);
}
视图=布局更平坦。充气(R.layout.completed\u exercise\u item,parent,false);
返回新的ViewHolderTwo(视图);
}
@凌驾
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder,int位置){
当前位置=位置;
如果(getItemViewType(位置)==0){
ViewHolderOne ViewHolderOne=(ViewHolderOne)支架;
if(行索引==位置){
viewHolderOne.relativeLayout.setBackgroundColor(Color.parseColor(“#567845”);
}否则{
viewHolderOne.relativeLayout.setBackgroundResource(R.颜色.深灰色);
}
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)支架;
if(行索引==位置){
viewHolderTwo.relativeLayout.setBackgroundColor(Color.parseColor(“#567845”);
}否则{
VIEWHOLDERTW.相对年轻人.挫折背景资源(R.颜色.深灰色);
}
viewHolderTwo.textViewSetNumber.setText(String.valueOf(AllCompletedExecutions.get(position.getSet_number()));
viewHolderTwo.textViewWeight.setText(String.valueOf(allCompletedExercises.get(position.getTotal_weight_lifted());
viewHolderTwo.textViewReps.setText(String.valueOf(allCompletedExecutions.get(position.getReps()));
}
}
@凌驾
public int getItemCount(){
返回所有已完成的练习。size();
}
@凌驾
public int getItemViewType(int位置){
//如果列表按时间顺序排序
如果(位置==0){
返回0;
}
if(allCompletedExercises.get(position).getChildExerciseName().equals(allCompletedExercises.get(position-1).getChildExerciseName()){
返回1;
}否则{
返回0;
}
}
类ViewHolderOne扩展了RecyclerView.ViewHolder{
私有TextView textViewExerciseName;
私有TextView textViewSetNumber;
私有文本视图文本视图权重;
私有文本视图文本视图代表;
私人亲戚;
public ViewHolderOne(@NonNull View itemView){
超级(项目视图);
textViewExerciseName=itemView.findViewById(R.id.textView\u ExerciseName3);
textViewSetNumber=itemView.findViewById(R.id.textView\u Set\u Number56);
textViewWeight=itemView.findViewById(R.id.textView\u weight 78);
textViewReps=itemView.findViewById(R.id.textView\u repss0);
relativeLayout=(relativeLayout)itemView.findViewById(R.id.exercise\u item\u relative);
itemView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
int position=getAdapterPosition();
itemClick.clickItemPosition(getAdapterPosition());
if(侦听器!=null&&position!=RecyclerView.NO\u位置){
onItemClick(allCompletedExercises.get(position));
}
}
});
}
}
类ViewHolder两个扩展RecyclerView.ViewHolder{
私有TextView textViewSetNumber;
私有文本视图文本视图权重;
私有文本视图文本视图代表;
私人亲戚;
public ViewHolderTwo(@NonNull View itemView){
超级(项目视图);
textViewSetNumber=itemView.findViewById(R.id.textView\u Set\u Number);
textViewWeight=itemView.findViewById(R.id.textView\u-weight);
textViewReps=itemView.findViewById(R.id.textView\u repss);
relativeLayout=(relativeLayout)itemView.findViewById(R.id.exercise\u item\u rel);
itemView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共空间点击(Vi)
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;
    }
}
   /////
public interface ItemClick {
    public  void clickItemPosition(int position);
}
public class RecordExerciseFragment extends Fragment implements  ItemClick {

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

}
final CompletedExercisesListAdapter2 adapter = new CompletedExercisesListAdapter2(this);
        recyclerView.setAdapter(adapter);
private ItemClick itemClick;
public void CompletedExercisesListAdapter2(ItemClick itemClick) {
       
        this.itemClick=itemClick;
}
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 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);

    }

}
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) {}

}