在哪里以及如何在recyclerview中单击onclick以在包含片段的活动中获得结果



在我的应用程序中,我有一个使用片段的活动。在一个这样的片段中,我使用了一个回收视图。我只想添加(一个或多个(onClick,我可以在片段或活动中酌情处理其操作。

我找了很多。我找到了很多解决方案,但在我看来,没有一个能真正回应我的情况,但这并不例外。我在OnBindviewHolder中找到了很多onClick的解决方案。然而,我也经常读到这种解决方案是不可接受的,因为它消耗了不必要的资源。我找到了一个解决方案(https://openclassrooms.com/en/courses/4568576-recover-and-display-distant-data/4893791-interact-with-the-recyclerview)使用一个有效的itemClickSupport类,但我不知道如何充分利用它。所以,我在兜圈子,我不知道我应该去哪条赛道,而不会浪费时间,在最后不必要地意识到我没有朝着正确的方向前进。

编辑:另一个对我来说似乎很完美的解决方案(https://openclassrooms.com/fr/courses/4568596-construisez-une-interface-utilisateur-flexible-et-adaptative/4789616-creez-votre-premiere-application-avec-des-fragments),通过回调自动在片段中创建它,但是,我不知道如何在父活动中获取它。

我真正想要的是:

在智能手机上:

  • 用recyclerview打开片段1的活动
  • 通过点击片段1中回收视图中的按钮打开另一个片段的另一个活动(具有另一个回收视图(

在平板电脑上(使用其他布局(:

  • 一个打开两个片段的活动,片段/回收视图1中的按钮填充片段/回收窗口2

我意识到我在解释我想要什么时遇到了很多困难,而我寻找解决方案的问题可能就来自于此。

我想我终于找到了一个有用的解决方案:

活动:

public class MainActivity extends FragmentActivity implements MainFragment.SampleOnClickedListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void sampleOnClicked(int position) {
Log.e("TAG", " from activity / position:" + position);
}
}

碎片:

public class MainFragment extends Fragment implements SampleAdapter.SampleRecyclerViewHolder.SampleOnListener {
private SampleOnClickedListener mCallback;
public interface SampleOnClickedListener {
void sampleOnClicked(int position);
}
public MainFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main, container, false);
SampleAdapter sampleAdapter = new SampleAdapter(this);
RecyclerView recyclerView = view.findViewById(R.id.sampleRecyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(view.getContext()));
recyclerView.setAdapter(sampleAdapter);
return view;
}
@Override
public void sampleOnClick(int position) {
Log.e("TAG", " from fragment / position:" + position);
mCallback.sampleOnClicked(position);
}
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
this.createCallbackToParentActivity();
}
private void createCallbackToParentActivity() {
try {
mCallback = (SampleOnClickedListener) getActivity();
} catch (ClassCastException e) {
throw new ClassCastException(e.toString() + " must implement OnButtonClickedListener");
}
}
}

适配器:

public class SampleAdapter extends RecyclerView.Adapter<SampleAdapter.SampleRecyclerViewHolder> {
private final SampleRecyclerViewHolder.SampleOnListener mListener;
public SampleAdapter(SampleRecyclerViewHolder.SampleOnListener listener) {
this.mListener = listener;
}
@NonNull
@Override
public SampleRecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false);
return new SampleRecyclerViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull SampleRecyclerViewHolder holder, int position) {
holder.itemView.setOnClickListener(v -> mListener.sampleOnClick(holder.getBindingAdapterPosition()));
}
@Override
public int getItemCount() {
// modify with real size
return 0;
}
public static class SampleRecyclerViewHolder extends RecyclerView.ViewHolder {
public SampleRecyclerViewHolder(@NonNull View itemView) {
super(itemView);
}
public interface SampleOnListener {
void sampleOnClick(int position);
}
}
}

如果我没有错的话,点击的结果可以在活动和片段中检索,这就是我所需要的。

最新更新