android - 如何访问片段内单击的 RecyclerView 项目位置?
问题描述
我有一个recyclerView
显示用户完成的练习。
在我的“适配器”类中,我有一个方法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);
}
}
分段
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 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) {}
}
推荐阅读
- ceph - 95% 的存储消耗后,Ceph 集群中的 1/3 OSD 下降
- html - 如何将所有标题元素设置为字体系列,但使用 SCSS 单独更改每个字体大小?
- python-3.x - 如何将我的 fastapi 请求标头操作为可变的
- reactjs - ReactJS 在我的嵌套迭代器中没有显示
- python - 如何使用正则表达式过滤删除某些数据框列,但保留包含某些字符的其他列?
- javascript - 基于真/假值的文本颜色
- java - JPA + Hibernate:如何将数组绑定与 CriteriaBuilder 一起使用,即使最终查询类似于“... in (?)”,而不是“... in (?, ?, ?)”?
- node.js - Nodemon不使用express在docker中更改时重新加载文件
- tableau-api - 查找的替代方案
- r - 这是如何错误的参数数量?