Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当一个活动中包含多个片段时,RecycleServiceClickListener onClick不在片段中工作_Android_Android Fragments_Android Recyclerview - Fatal编程技术网

Android 当一个活动中包含多个片段时,RecycleServiceClickListener onClick不在片段中工作

Android 当一个活动中包含多个片段时,RecycleServiceClickListener onClick不在片段中工作,android,android-fragments,android-recyclerview,Android,Android Fragments,Android Recyclerview,这个有点难以解释和证明。我会尽力的。 我有两个片段ItemListFragment和ItemViewFragment:一个片段包含一个recycleview并在recycleview中列出,另一个片段分别显示一个项目 在ItemListFragment中,有RecycleServiceClickListener来处理对列表项的单击。 实施情况如下: public class ItemListFragment extends Fragment { private OnFragmentLi

这个有点难以解释和证明。我会尽力的。 我有两个片段ItemListFragment和ItemViewFragment:一个片段包含一个recycleview并在recycleview中列出,另一个片段分别显示一个项目

在ItemListFragment中,有RecycleServiceClickListener来处理对列表项的单击。 实施情况如下:

public class ItemListFragment extends Fragment {

    private OnFragmentListClickListener onClickListener = null;

    public interface OnFragmentListClickListener {
        void OnFragmentListClick(ItemModel Item);
    }

    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        class RecyclerViewClickListenerImpl implements RecyclerViewClickListener {
            @Override
            public void onClick(View view, int position) {
                if (onClickListener != null) {
                    onClickListener.OnFragmentListClick(adapter.getItem(position));
                }
        }

        adapter = new ItemListAdapter(getActivity(), ItemModelList, new RecyclerViewClickListenerImpl());
        mRecyclerView = getActivity().findViewById(R.id.recycler_view);
        RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(getActivity(), 2);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        mRecyclerView.setAdapter(adapter);
        .
        .
        .
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        Toast.makeText(getActivity(), "onAttach", Toast.LENGTH_SHORT).show();
        if (context instanceof OnFragmentListClickListener) {
            onClickListener = (OnFragmentListClickListener) context;
        }
    }
    .
    .
    .
}
该列表包含缩略图(加载了Glide)和每次的文本

当我在实现ItemListFragment.OnFragmentListClickListener界面的活动中添加此片段时,使用以下代码一切正常:

public class MainActivity extends AppCompatActivity
        implements ItemListFragment.OnFragmentListClickListener {
    .
    .
    .
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ItemListFragment fragment_list = ItemListFragment.newInstance();
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.content_frame, fragment_list);
        fragmentTransaction.commit();
    }

    @Override
    public void OnFragmentListClick(CameraModel camera) {
        // handle the list click
    }
    .
    .
    .
}
当我尝试在我的活动中添加第二个片段(ItemViewFragment)时,事情变得很奇怪,如下所示:

public class ItemListFragment extends Fragment {

    private OnFragmentListClickListener onClickListener = null;

    public interface OnFragmentListClickListener {
        void OnFragmentListClick(ItemModel Item);
    }

    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        class RecyclerViewClickListenerImpl implements RecyclerViewClickListener {
            @Override
            public void onClick(View view, int position) {
                if (onClickListener != null) {
                    onClickListener.OnFragmentListClick(adapter.getItem(position));
                }
        }

        adapter = new ItemListAdapter(getActivity(), ItemModelList, new RecyclerViewClickListenerImpl());
        mRecyclerView = getActivity().findViewById(R.id.recycler_view);
        RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(getActivity(), 2);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        mRecyclerView.setAdapter(adapter);
        .
        .
        .
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        Toast.makeText(getActivity(), "onAttach", Toast.LENGTH_SHORT).show();
        if (context instanceof OnFragmentListClickListener) {
            onClickListener = (OnFragmentListClickListener) context;
        }
    }
    .
    .
    .
}
当存在第二个片段时,不再调用ItemListFragment上的RecyclServiceWClickListener的onClick:

class RecyclerViewClickListenerImpl implements RecyclerViewClickListener {
    @Override
    public void onClick(View view, int position) {
        if (onClickListener != null) {
            onClickListener.OnFragmentListClick(adapter.getItem(position));
        }
}
此外,当在活动中添加第二个片段时,ItemListFragment中的某些Thmbnail停止工作


这是一个奇怪的。。。我尝试使用fragmentTransaction.add而不是fragmentTransaction.add以及所有类型的组合…

您希望将onClick放在回收视图的项目中。您应该在ViewHolder类中完成项目的所有操作(例如:加载图像、为视图生成事件等)。因为在活动或片段中更容易查看源代码。您可以使用此引用我的ViewHolder类。这将对您有所帮助。

从我所读到的内容来看,这实际上不是一个好方法。。。点击事件的处理不应该在viewHolder中进行,而是在片段中进行,我认为在活动中进行更好(这就是我所做的)我知道这将是一个棘手的lol:)哈哈知道这将没有答案。。。太复杂了,我自己会找到解决办法的