Класс фрагмента с ListView?

Возможно ли иметь собственный ListView внутри класса Fragment?

Это мой класс фрагментов, в котором fragment_find_people — это просто пустой XML:

public class FindPeopleFragment extends Fragment {

public FindPeopleFragment(){}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_find_people, container, false);

    return rootView;
}

}

У меня уже есть customListView, но он работает только с классом Activity. Как я могу передать это Fragment?

мой listview_main xml

<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:id="@+id/listmain" >

<ListView
    android:id="@+id/listview"
    android:layout_marginTop="10dp"
    android:background="@drawable/bg"
    android:divider="#9c9c9c"
    android:dividerHeight="5dp"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" /></RelativeLayout>

person AndroidNewbie    schedule 30.12.2013    source источник
comment
Возможный дубликат stackoverflow.com/questions /16291459/   -  person Eugen Martynov    schedule 30.12.2013
comment
@EugenMartynov Я использую класс фрагментов, а не класс активности   -  person AndroidNewbie    schedule 30.12.2013
comment
@user3138250 user3138250 Опубликуйте еще немного кода. Что вы пробовали для этого?   -  person GrIsHu    schedule 30.12.2013
comment
@user3138250 user3138250 Вы пытались связать представление списка с некоторыми данными?   -  person GrIsHu    schedule 30.12.2013
comment
я пробовал в классе Activity, но еще не в классе Fragment   -  person AndroidNewbie    schedule 30.12.2013
comment
Кстати, вам больше не следует использовать fill_parent для ширины и высоты в android xml.   -  person andrea.rinaldi    schedule 02.02.2017


Ответы (5)


Контекст класса замените на getActivity, это единственная разница, и замените вид, а не активность:

View rootView = inflater.inflate(R.layout.fragment_find_people, container, false);
//now you must initialize your list view
Listview listview =(Listview)rootView .findViewById(R.id.your_listview);

//EDITED Code 
String[] items = new String[] {"Item 1", "Item 2", "Item 3"};
ArrayAdapter<String> adapter =
new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, items); 

listview.setAdapter(adapter);  

//To have custom list view use this : you must define CustomeAdapter class
//listview.setadapter(new CustomeAdapter(getActivity()));
//getActivty is used instead of Context
return view;
person QuokMoon    schedule 30.12.2013
comment
это мой основной класс, если я использую класс Activity ссылка, теперь я хочу передать эти коды, где мой основной класс является фрагмент - person AndroidNewbie; 30.12.2013
comment
easyinfogeek.com/2013/07/full- example-of-using-fragment-in.html эта ссылка на 100 % решит вашу проблему - person QuokMoon; 30.12.2013
comment
Сэр, это не работает, учебник очень запутан. у вас есть его образец? - person AndroidNewbie; 30.12.2013

Внутри метода onCreateView сначала определите свой макет.

RelativeLayout rl=(RelativeLayout)inflater.inflate(R.layout.status,container, false);
        list=(ListView) rl.findViewById(R.id.list1);
         itemList = new ArrayList<HashMap<String, String>>();

          // fill the defined arraylist using and asynctask or any other method

           adapter=new Customadapt(context.getActivity(), itemList);        
           list.setAdapter(adapter);
           return rl;
person Jai Kumar    schedule 30.12.2013

вы также можете создать собственное представление списка программно. например:

 public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {


    return new CustomListView(container.getContext());
}
person vipul mittal    schedule 30.12.2013

Внутри метода onCreateView(...) вызовите свой CustomListAdapter следующим образом

adapter = new CustomListAdapter(getActivity());
customListView.setAdapter(adapter);

И ваш CustomListAdapter следующим образом, например

private class CustomListAdapter extends BaseAdapter {


    LayoutInflater inflater;
    public Context context;

    public CustomListAdapter(Context context) {

        this.context = context;
        inflater = LayoutInflater.from(this.context);

    }

 .......
 .......
}
person Saj    schedule 30.12.2013

Во-первых, да, это возможно. Вот как.

Как и в случае со всеми другими ресурсами, есть два способа объявить их. Программно и через XML-файлы макета. Я объясню, как использовать XML, так как это то, что я использую чаще всего и считаю лучшим.

В fragment_find_people XML объявите макет как обычный. В этом макете я предполагаю, что по крайней мере LinearLayout вам нужно добавить ListView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/fragment_find_people_linear_layout"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:orientation="vertical">

<ListView
        android:id="@id/your_list_view_id"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"/>
</LinearLayout>

Теперь вы можете просто создать экземпляр этого ListView, используя:

Listview listView =(ListView)rootView.findViewById(R.id.your_list_view_id);

Чтобы использовать "тот самый" ListView, я бы рекомендовал просто продублировать код ListView из одного файла макета, тот, что для вашего Activity, в Fragment. Вы также можете отделить объявление ListView в отдельный XML, что было бы более аккуратно, если бы вы часто использовали его повторно, но для небольшого проекта просто скопируйте его.

person Eric    schedule 30.12.2013
comment
Моя беда, это была опечатка. Класс называется ListView (обратите внимание на CamelCase), а не Listview. Я исправил это. - person Eric; 02.01.2014