Cómo llamar a un fragmento de BaseAdapter Class Android?

Quiero llamar a un fragmento de mi clase BaseAdapter. En esta clase tengo un botón de clic del que quiero llamar al nuevo fragmento, pero no puedo conseguirlo. Tengo que pasar valores del clic del botón al fragmento.

Clase BaseAdapter

public class StatusAdapter extends BaseAdapter { private Activity activity; private ArrayList<HashMap<String, String>> data; private static LayoutInflater inflater = null; public StatusAdapter(Activity a, ArrayList<HashMap<String, String>> d) { activity = a; data = d; inflater = (LayoutInflater) activity .getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { // TODO Auto-generated method stub return data.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View vi = convertView; if (convertView == null) vi = inflater.inflate(R.layout.approval_selftrip_inner, null); TextView approved_by = (TextView) vi.findViewById(R.id.approved_by); TextView status = (TextView) vi.findViewById(R.id.status); TextView trip = (TextView) vi.findViewById(R.id.trip); Button view_log = (Button)vi.findViewById(R.id.view_log); HashMap<String, String> list = new HashMap<String, String>(); list = data.get(position); approved_by.setText(list.get("first_id")); status.setText(list.get("status")); trip.setText(list.get("trip")); view_log.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //Here i want to call my fragment } }); return vi; } } 

Fragmento

 public class Log extends Fragment { Context context ; View rootView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { context = getActivity(); rootView = inflater.inflate(R.layout.activity_log, container, false); return rootView; } } 

Quiero llamar a este fragmento de la clase BaseAdapter en el clic de view_log . view_log favor, ayúdame cómo podemos hacer esto

Después de Martin Cazares he hecho esto

En Actividad

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { context = getActivity(); rootView = inflater.inflate(R.layout.activity_main, container, false); mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Recived", Toast.LENGTH_LONG).show(); ApprovalLog fragment2 = new ApprovalLog(); FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager .beginTransaction(); fragmentTransaction.replace(R.id.content_frame, fragment2); fragmentTransaction.commit(); } }; return rootView; } 

En la clase AdapterClass

 view_approvallog.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { CommonUtils.showAlert("Test in Adapter", activity); activity.registerReceiver(mBroadcastReceiver, new IntentFilter( "start.fragment.action")); } }); 

Simplemente utilice esto.

 public void onClick(View view) { LogFrag fragment2 = new LogFrag(); FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.fragment1, fragment2); fragmentTransaction.commit(); } 

Honestamente si usted tiene que llamar a su fragmento de un BaseAdapter algo está terriblemente mal con la arquitectura de su aplicación, que están estrechamente los componentes de acoplamiento y Spaghetti Código será un problema pronto, si desea mantenerlo limpio, hacer un oyente o enviar una emisión de Y llamar a su fragmento de su actividad como lo hace normalmente, el punto es mantener los componentes haciendo el trabajo que están destinados y no tener todos en una sola clase, eso es una cosa terrible de hacer y el código se vuelve menos legible.

Como se explicó un simple enfoque para desacoplar las cosas en android es mediante el envío de mensajes de difusión, por lo que esta es una manera de hacerlo:

  view_log.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //Here i want to call my fragment //You need to pass a reference of the context to your adapter... context.sendBroadcast(new Intent("start.fragment.action")) } }); 

Ahora en su actividad todo lo que tiene que hacer es registrar un BroadcastReceiver con el "start.fragment.action" y eso es todo dentro de él solo llame a su fragmento:

 //In your activity... context.registerReceiver(mBroadcastReceiver, new IntentFilter("start.fragment.action")) . . . BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { //This piece of code will be executed when you click on your item // Call your fragment... } }; 

No te olvides de anular el registro cuando termines, y si necesitas pasar algunos parámetros al fragmento puedes usar extras en la intención al enviar el mensaje de difusión …

NOTA: LocalBroadcastManager sería mejor utilizar ahora.

¡Saludos!

Utilizar

 ((Activity) mContext).getFragmentManager();//use this view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Fragment fragment = new CallThisFragment(); FragmentManager fragmentManager = ((Activity) mContext).getFragmentManager(); fragmentManager.beginTransaction().replace(R.id.main_activity, fragment).commit(); } }); 

Manera más fácil: Do in Fragment

 Adapter a = new Adapter(arg,Fragment.this);// or only this. This will pass the fragment object to the adapter. 

Y en Adaptador

 v.ckbox.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if(fragment!=null) fragment.ValidateList();// call any public method of the fragment } }); 

Forma perfecta de llamar fragmento del adaptador de base personalizada

 fragmentManager.beginTransaction() .add(R.id.content_frame, new YourFragmentName()) .addToBackStack("fragBack")).commit(); ((Activity) context).setTitle("Title For Action Bar");` 
  • Instalar / desinstalar APKs de forma programática (PackageManager vs Intents)
  • Android - ¿Cómo abrir la aplicación de correo electrónico?
  • ¿Se necesita permiso para usar Intent para llamar al teléfono?
  • Problema de orientación ACTION_IMAGE_CAPTURE en Nexus S y Samsung Galaxy S I9000
  • Android: diálogo abierto para seleccionar audio
  • Obtener resultado de una actividad después de terminar (); En una prueba de unidad de Android
  • Android: Pasar datos (extras) a un fragmento
  • Pestañas personalizadas de Chrome y filtro de intenciones
  • Opcionalmente, iniciar actividades y utilizar notificaciones de servicios en Android. Sólo lanzar o notificar si una determinada aplicación está presente
  • Principiante: usando variables definidas en una clase en otra clase
  • Codename one android intercepting urls issue
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.