Domanda

In generale la maggior parte del tempo che lavoro con intento piuttosto che frammento perché l'ho trovato in qualche modo complesso.Ho una classe con ListView per mostrare alcuni dati da un array e voglio convertirlo in frammento anche vogliono passare gli extra in una nuova classe frammentata.

Classe ListView:

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);

            }
        });

    }

}
.

Classe CustomList:

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;
    }
}
.

Ho ottenuto una classe principale con tre schede create utilizzando frammenti e in questa classe vorrei aggiungere la vista 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);

    }

}
.

Quello che voglio fare è mostrare la valida di listview nella classe Fragment e quando un elemento di elenco verrà fatto clic che voglio avviare il nuovo intento per mostrare quale elemento è stato cliccato!

È stato utile?

Soluzione

Se si desidera passare i parametri in un frammento, la pratica comune è creare un metodo statico che produce un'istanza del tuo frammento con determinati parametri. Hai già il metodo newInstance, ora devi solo aggiungere parametri agli argomenti e restituire il frammento. Dovresti controllare gli argomenti nel tuo onCreateView, il seguente è un esempio di come scrivere 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;

    }
}
.

Per il tuo caso specifico, potresti passare lungo l'array di stringa e aggiungerlo come argomento.

Spero che questo aiuti. Buona fortuna!

Modifica

Il problema che stai affrontando è che stai istanziando un ListView nel tuo Activity quando è in realtà, dovresti farlo nel tuo Fragment. Gli intenti non sono necessari qui, è solo necessario assicurarsi che ci sia un attributo ListView per ottenere dal layout che si allega al tuo Fragment. Quanto segue è un piccolo esempio di come dovrebbe funzionare.

Nota, questo metodo va nella tua classe LayoutOne

@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;

}
.

Come nota, Fragments non hanno il metodo findViewById. Devi chiamarlo sul View che stai gonfiando di essere il suo layout, quindi in questo caso hai gonfiato root e quindi chiameresti root.findViewById(R.id.some_id) per ottenere una vista.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top