繁体   English   中英

在哪里以及如何将 onclick 放入 recyclerview 以获取包含该片段的活动的结果?

[英]where and how to put a onclick in recyclerview to get the result in the activity that contain the fragment?

在我的应用程序中,我有一个使用片段的活动。 在这样一个片段中,我使用的是回收视图。 我只想添加(一个或多个)onClick(s),我可以根据需要在片段或活动中处理其操作。

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

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

我真正想要的是:

在智能手机上:

  • 使用 recyclerview 打开片段 1 的活动
  • 通过单击来自片段 1 的回收视图中的按钮打开另一个片段(带有另一个回收视图)的另一个活动

在平板电脑上(使用另一种布局):

  • 打开两个片段的活动,以及片段/recyclerview 1 中的按钮填充片段/recyclerview 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);
        }
    }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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