Открытие нового фрагмента с помощью кнопки RecyclerView внутри фрагмента - PullRequest
0 голосов
/ 21 февраля 2020

У меня работает фрагмент, который имеет часть своего макета загрузки карты RecyclerView. Из этой карты я хочу запустить новый фрагмент, который открывает полноэкранный макет.

public class MemoriesFragment extends Fragment {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    MemListFragment fragment = new MemListFragment();
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(R.id.placeholder, fragment);
    fragmentTransaction.commit();
}

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_authoring_memory_menu_1, container, false);

    return view;
}}

Это основной фрагмент. Следующий фрагмент - это фрагмент, который создает и заполняет RecyclerView

public class MemListFragment extends Fragment  {

ImageButton button1;

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_authoring_memory_list, container,false);

    RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.listRecyclerView);

    ListAdapter listAdapter = new ListAdapter();
    recyclerView.setAdapter(listAdapter);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(layoutManager);

    button1 = view.findViewById(R.id.memory_image);

    return view;

}}

Это RecyclerView

    public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {

    private LayoutInflater layoutInflater;
    private List<String> data;
    public ImageButton memory_image;

    public Adapter(MemoriesFragment Context, List<String> data){
       // this.layoutInflater = LayoutInflater.from();
        this.data = data;
   }

@NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = layoutInflater.inflate(R.layout.memory_view,viewGroup,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
        // bind the textview with data received

        String title = data.get(i);
        viewHolder.textTitle.setText(title);
        // similarly you can set new image for each card and descriptions
        viewHolder.memoryButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AppCompatActivity activity = (AppCompatActivity) view.getContext();
                Fragment MemoryDetails = new MemoryDetails();
                activity.getSupportFragmentManager().beginTransaction().replace(R.id.placeholder, MemoryDetails).addToBackStack(null).commit();
            }
        });
    }
    @Override
    public int getItemCount() {
        return data.size();
    }
    public class ViewHolder extends RecyclerView.ViewHolder  {
        // Define UI components here
        TextView textTitle;
        ImageButton memoryButton;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            textTitle = itemView.findViewById(R.id.textTitle);
            memoryButton = itemView.findViewById(R.id.memory_image);
        }
    }
}

Recylerview создается с помощью memory_view. xml, в котором есть только текст и кнопка изображения с именем memory_image. Когда я запускаю этот код, происходит сбой при нажатии кнопки изображения.

Редактировать: добавлен журнал ошибок ниже

2020-02-21 16:50:29.334 19558-19558/com.app.emotivo E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.app.emotivo, PID: 19558
java.lang.IllegalStateException: Could not find method onClick(View) in a parent or ancestor Context for android:onClick attribute defined on view class androidx.appcompat.widget.AppCompatImageButton with id 'memory_image'
    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:434)
    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:391)
    at android.view.View.performClick(View.java:6256)
    at android.view.View$PerformClick.run(View.java:24701)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

Ответы [ 2 ]

0 голосов
/ 22 февраля 2020

отображение фрагмента внутри адаптера не очень хорошая вещь. Я думаю, в первую очередь используйте навигацию на Android Jetpack или используйте Rx Java и перенесите форматирующее представление от адаптера к фрагменту.

0 голосов
/ 22 февраля 2020

Я не уверен, что это работает, но вы можете попробовать использовать supportfragmentmanager и во фрагменте памяти, и привести результат itemView.findViewById(R.id.memory_image) к ImageButton, как это (ImageButton)itemView.findViewById(R.id.memory_image)

...