How to call a fragment from an Android RecyclerView?

0

As you can call an un fragment when you select an element of my RecyclerView, I already search the internet and no method works for me. I would appreciate your strong response, I urge a lot. Thanks

My Adapter's code

public class ReciclerAdapter extends RecyclerView.Adapter<ReciclerAdapter.ViewHolder> {
public static class ViewHolder extends RecyclerView.ViewHolder{
    private TextView label;
    ImageView foto;

    public ViewHolder(View itemView) {
        super(itemView);
        label=(TextView)itemView.findViewById(R.id.label);
        foto=(ImageView)itemView.findViewById(R.id.ImgCabecera);
    }
}

public List<Contenido> listContent;

public ReciclerAdapter(List<Contenido> listContent) {
    this.listContent = listContent;
}


@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.desing_tarjetas,parent,false);
    ViewHolder viewHolder=new ViewHolder(view);
    return viewHolder;
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    holder.label.setText(listContent.get(position).getTitulo());
    holder.foto.setImageResource(listContent.get(position).getFoto());
}

public int getItemCount(){
    return listContent.size();
}

}

The code of my ReciclerView

public class ScrollingInfo extends AppCompatActivity {

private RecyclerView recyclerViewTarjetas;
private ReciclerAdapter adaptadorTarjetas;

private TextView FuenteCards;
private Typeface BoldRobot;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_scrolling_info);
    Toolbar toolbar = (Toolbar) findViewById(R.id.main_toolbar);
    setSupportActionBar(toolbar);

    recyclerViewTarjetas=(RecyclerView)findViewById(R.id.recyclerTarjetas);
    recyclerViewTarjetas.setLayoutManager(new LinearLayoutManager(this));

    adaptadorTarjetas=new ReciclerAdapter(obtenerDatos());
    recyclerViewTarjetas.setAdapter(adaptadorTarjetas);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();

        }
    });



}

public List<Contenido>obtenerDatos(){
    List<Contenido> datos=new ArrayList<>();
    datos.add(new Contenido("¿Que son las 5R?",R.drawable.ecologia));
    datos.add(new Contenido("Conciencia",R.drawable.conciencia));
    datos.add(new Contenido("Encuesta",R.drawable.encuesta));

    return datos;
}

}

    
asked by Braulio 24.06.2018 в 04:26
source

2 answers

0

You must create a interfase :

public class ScrollingInfo extends AppCompatActivity implements ReciclerAdapter.OnItemClickListener {

// instancias la interfase en la Activity (o Fragment):
 ....
recyclerViewTarjetas.setAdapter(adaptadorTarjetas);
adaptadorTarjetas.setOnItemClickListener(this);
}

In the Adapter instances the listener:

public class ReciclerAdapter extends RecyclerView.Adapter<ReciclerAdapter.ViewHolder>{
private OnItemClickListener miListener;
public List<Contenido> listContent;

 public interface OnItemClickListener {
    void onItemClick(int position);  // este es el método del onclick de la interfase
}
public void setOnItemClickListener(OnItemClickListener listener){
    miListener = listener;
}

 // llamas al listener dentro de onBindViewHolder
 // y al holder lo declaras como final:
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
    holder.label.setText(listContent.get(position).getTitulo());
    holder.foto.setImageResource(listContent.get(position).getFoto());

    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (miListener != null){
                int position = holder.getAdapterPosition();
                if(position != RecyclerView.NO_POSITION){
                    miListener.onItemClick(position);  // el método onclick de la interfase, en todo el row (itemView)
                }
            }
        }
    });

In the Activity (or Fragment) you create the OnItemClick method:

 @Override
 public void onItemClick(int position) {
 Toast.makeText(getContext(), "tarjeta Clickeada "+position, Toast.LENGTH_SHORT).show();

 // obtienes la posicion del row clickeado:
 Contenido clickedItem = obtenerDatos().get(position);

 // Instancias un fragment, aquí se envían los datos, suponiendo que se llame FragmentDetalle:
 FragmentDetalle f = FragmentDetalle.newInstance(clickedItem.getTitulo(),clickedItem.getFoto());
 FragmentManager fragmentManager = getFragmentManager();
 fragmentManager .beginTransaction().replace(R.id.container, f).addToBackStack(null).commit();

 ///// PARA UNA ACTIVITY /////////////
 /*Intent intent = new Intent(getContext(),ActivityDetalle.class);
    intent.putExtra("titulo", clickedItem.getTitulo());
    intent.putExtra("ima", clickedItem.getFoto());
    startActivity(intent);*/
}

In the "Detail" Fragment:

public class FragmentDetalle extends Fragment{
ImageView imagen;
TextView title;
private static final String PARAM1 = "param1";
private static final String PARAM2 = "param2";
String tit;
int ima;

// declaras la instancia del fragment, será llamado en cada click de los row 
//del RecyclerView:
public static FragmentDetalle newInstance(String titulo, int foto) {  
FragmentDetalle f = new FragmentDetalle();
Bundle args = new Bundle()
args.putString(PARAM1, titulo);
args.putInt(PARAM2, foto);
f.setArguments(args);
return f;
}

// se obtienen en onCreate. Se realiza así para que no se pierdan los datos 
//en caso de recrear el fragment

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        tit = getArguments().getString(PARAM1);
        ima = getArguments().getInt(PARAM2);
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_detalle, container, false);
title = (TextView) v.findViewById(R.id.tuTextView);
imagen = (ImageView) v.findViewById(R.id.tuImageView);

 // y lo configuras así:
title.setText(tit);
imAgen.setImageResource(ima);

return v;
}
}

 ////// EN CASO DE ACTIVITY en OnCreate///

 String value1 = "";
 int value2 = 0; 

 Bundle extras = getIntent().getExtras();
    if (extras !=null){
        value1 =  extras.getString("titulo");
        value2 = extras.getInt("ima");
    }

  textView.setText(value1);

In your POJO the photo must be int no String :

public class Contenido {
  private String titulo;
  private int foto;
  ...
    
answered by 24.06.2018 / 19:14
source
0
holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            ((MainActivity) context).ID_Curso = mListDatos.get(position).IdCurso;

            ((MainActivity) context).viewPager.setCurrentItem(1, true);

            ((Activity) context).finish();
        }
    });

with this you listen to the reicles view for when you press call the fragment .... I hope it serves you :) By: JJ

    
answered by 24.06.2018 в 05:56