Вопрос

В общем, большую часть времени я работаю с намерением, а не с фрагментом, потому что мне это кажется сложным.У меня есть класс с ListView для отображения некоторых данных из массива, и я хочу преобразовать их во фрагмент, а также хочу передать дополнительные функции в новый фрагментированный класс.

Класс 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);

            }
        });

    }

}

Класс 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;
    }
}

У меня есть основной класс с тремя вкладками, созданными с использованием фрагмента, и в этот класс я хотел бы добавить 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);

    }

}

Что я хочу сделать, так это показать представление списка в классе фрагмента, и когда элемент списка будет щелкнут, я хочу запустить новое намерение, чтобы показать, какой элемент был нажат!

Это было полезно?

Решение

Если вы хотите передать параметры во фрагмент, обычной практикой является создание статического метода, который создает экземпляр вашего фрагмента с определенными параметрами.У вас уже есть newInstance метод, теперь вам просто нужно добавить параметры к аргументам и вернуть Fragment.Вам следует проверить аргументы в вашем onCreateView Ниже приведен пример того, как его написать.

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;

    }
}

В вашем конкретном случае вы можете передать массив String и добавить его в качестве аргумента.

Надеюсь это поможет.Удачи!

Редактировать

Проблема, с которой вы столкнулись, заключается в том, что вы создаете экземпляр ListView в вашей Activity когда на самом деле вам следует делать это в своем Fragment.Интенты здесь не нужны, нужно просто убедиться, что есть ListView атрибут, который можно получить из макета, который вы прикрепляете к своему Fragment.Ниже приведен небольшой пример того, как это должно работать.

Обратите внимание: этот метод входит в ваш 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;

}

В качестве примечания, Fragmentу нас нет findViewById метод.Вам нужно позвонить туда по номеру View который вы надуваете, чтобы сделать его макетом, поэтому в данном случае вы надули root а потом ты бы позвонил root.findViewById(R.id.some_id) чтобы получить представление.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top