Pregunta

En general, la mayor parte del tiempo trabajo con Intent en lugar de Fragment porque lo encontré de alguna manera complejo.Tengo una clase con ListView para mostrar algunos datos de una matriz y quiero convertirla en Fragmento, también quiero pasar los extras en una nueva clase fragmentada.

Clase de vista de lista:

public class MainActivity extends Activity {
    ListView list;
    String[] web = { "Google", "Twitter", "Windows", "Bing", "Itunes",
            "Wordpress", "Drupal" };
    Integer[] imageId = { R.drawable.ic_launcher, R.drawable.ic_launcher,
            R.drawable.ic_launcher, R.drawable.ic_launcher,
            R.drawable.ic_launcher, R.drawable.ic_launcher,
            R.drawable.ic_launcher

    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        CustomList adapter = new CustomList(MainActivity.this, web, imageId);
        list = (ListView) findViewById(R.id.list);
        list.setAdapter(adapter);
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                Toast.makeText(MainActivity.this,
                        "You Clicked at " + web[+position], Toast.LENGTH_SHORT)
                        .show();


                Intent i = new Intent(MainActivity.this, intent.class);
                i.putExtra("name", web[+position]);
                startActivity(i);

            }
        });

    }

}

Clase de lista personalizada:

public class CustomList extends ArrayAdapter<String> {

    private final Activity context;
    private final String[] web;
    private final Integer[] imageId;

    public CustomList(Activity context, String[] web, Integer[] imageId) {
        super(context, R.layout.list_single, web);
        this.context = context;
        this.web = web;
        this.imageId = imageId;

    }

    @Override
    public View getView(int position, View view, ViewGroup parent) {
        LayoutInflater inflater = context.getLayoutInflater();
        View rowView = inflater.inflate(R.layout.list_single, null, true);
        TextView txtTitle = (TextView) rowView.findViewById(R.id.txt);

        ImageView imageView = (ImageView) rowView.findViewById(R.id.img);
        txtTitle.setText(web[position]);

        imageView.setImageResource(imageId[position]);
        return rowView;
    }
}

Obtuve una clase principal con tres pestañas creadas usando fragmentos y en esta clase me gustaría agregar ListView.

public class LayoutOne extends Fragment {


    public static Fragment newInstance(Context context) {
        LayoutOne f = new LayoutOne();  

        return f;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.layout_one, null);
        return root;

    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

    }

}

Lo que quiero hacer es mostrar la vista de lista en la clase de fragmento y cuando se haga clic en un elemento de la lista, quiero iniciar la Nueva intención para mostrar en qué elemento se hizo clic.

¿Fue útil?

Solución

Si desea pasar parámetros a un Fragmento, la práctica común es crear un método estático que produzca una instancia de su Fragmento con ciertos parámetros.ya tienes el newInstance método, ahora solo necesita agregar parámetros a los argumentos y devolver el Fragmento.Deberías comprobar los argumentos en tu onCreateView El siguiente es un ejemplo de cómo escribirías uno.

public class LayoutOne extends Fragment 
{

    public static Fragment newInstance(int someInt, String someString) 
    {
        LayoutOne f = new LayoutOne();

        Bundle args = new Bundle();
        args.putInt("someInt", someInt);
        args.putString("someString", someString);
        f.setArguments(args);

        return f;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) 
    {
        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.layout_one, null);
        Bundle args = getArguments();

        //From here you would check to see if your arguments are present 
        //proceed accordingly

        return root;

    }
}

Para su caso específico, puede pasar la matriz String y agregarla como argumento.

Espero que esto ayude.¡Buena suerte!

Editar

El problema al que te enfrentas es que estás creando una instancia de un ListView en tus Activity cuando en realidad deberías hacerlo en tu Fragment.Las intenciones no son necesarias aquí, solo debes asegurarte de que haya una ListView atributo para obtener del diseño que adjunta a su Fragment.El siguiente es un pequeño ejemplo de cómo debería funcionar.

Tenga en cuenta que este método va en su LayoutOne clase

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) 
{
    ViewGroup root = (ViewGroup) inflater.inflate(R.layout.layout_one, null);

    //Be sure to use the actual id of your list view
    ListView lv = (ListView) root.findViewById(R.id.list_view_id);

    //Make sure that you retrieve the values for 'web' and 'imageId' from 
    //the activity using the "newInstance" method.
    CustomList adapter = new CustomList(getActivity(), web, imageId);
    lv.setAdapter(adapter);

    //From here, set your onClickListener and stuff as you did in your Activity

    return root;

}

Como nota, Fragmentno tenemos el findViewById método.Tienes que llamarlo al View que estás inflando para ser su diseño, por lo que en este caso inflaste root y luego llamarías root.findViewById(R.id.some_id) para tener una vista.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top