Невозможно изменить фрагмент после нажатия на пункты просмотра - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть RecyclerView в моей основной деятельности. Я хочу изменить разные фрагменты после нажатия на разные пункты в Rickler. Я пытаюсь сделать это, используя позицию из onbindviewholder (), но я не могу изменить фрагмент, когда нажимаю на элементы в программе recyclerview. Я не получаю никакой ошибки, но в то же время ничего не происходит по щелчку на утилите. Пожалуйста, проверьте мой код и скажите, где я ошибаюсь или какая строка кода мне не хватает.

RecyclerAdapter Code:

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
ArrayList<NewModel> newModels;
Context context;
public RecyclerAdapter(ArrayList<NewModel>newModels, Context context){
    this.newModels = newModels;
    this.context = context;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.recy_layout, parent,false);
    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
    holder.imageView.setImageResource(newModels.get(position).getImg());
    holder.textView.setText(newModels.get(position).getText());
    holder.imageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(position ==1){
                ((FragmentActivity)context).getSupportFragmentManager().beginTransaction()
                        .replace(R.id.framelayout, new FirstFragment());
            }
            else if(position ==2){
                ((FragmentActivity)context).getSupportFragmentManager().beginTransaction()
                        .replace(R.id.framelayout, new SecondFragment());
            }

        }
    });

}

@Override
public int getItemCount() {
    return newModels.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {
    ImageView imageView;
    TextView textView;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        imageView = itemView.findViewById(R.id.cirlceimg);
        textView = itemView.findViewById(R.id.text1);
    }
}

}

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

Вы можете обработать onClickListener из вашей деятельности, используя реализацию обратного вызова с интерфейсом.

Интерфейс:

public interface OnItemClickListener {
    void onItemClick(int position);
}

Добавьте слушателя к конструктору вашего адаптера

ArrayList<NewModel> newModels;
Context context;
private final OnItemClickListener listener;

public RecyclerAdapter(ArrayList<NewModel>newModels, Context context, OnItemClickListener listener){
    this.newModels = newModels;
    this.context = context;
    this.listener = listener;
}

В вашем onBindViewHolder установите clicklistener

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
    holder.imageView.setImageResource(newModels.get(position).getImg());
    holder.textView.setText(newModels.get(position).getText());
    holder.imageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           listener.onItemClick(position);
        }
    });

}

В вашей деятельности:

RecyclerAdapter rvAdapter = new RecyclerAdapter(newModels, this, new RecyclerAdapter.OnItemClickListener() {
        @Override public void onItemClick(int item) {
            if(position ==1){
                    getSupportFragmentManager().beginTransaction().replace(R.id.framelayout, new FirstFragment()).commit();;}
            else if(position ==2){
                        getSupportFragmentManager().beginTransaction().replace(R.id.framelayout, new SecondFragment()).commit();;
                    }
            }});
recycler.setAdapter(rvAdapter);
0 голосов
/ 13 апреля 2020

вы забыли вызвать commit ()

сделать это:

(((FragmentActivity)context).getSupportFragmentManager().beginTransaction()
                        .replace(R.id.framelayout, new SecondFragment()).commit();

Фрагмент не отображается, пока вы не вызовите commit () для транзакции, потому что транзакция использовать шаблон построителя, а в шаблоне построителя есть способ сказать, что я не хочу ничего делать, просто создаю объект, обычно это метод name create () , build () и commit () в данном случае

...