2013-11-14 3 views
1

Я начинаю разработку Android. Для проекта, я хотел бы знать, как реализовать listview во фрагмент?Как реализовать список в фрагменте?

В моем проекте у меня есть 3 фрагмента.

Мне нужно получить все контакты, которые находятся в моем телефоне. (Я использую этот пример =>http://samir-mangroliya.blogspot.fr/p/android-read-contact-and-display-in.html). Затем я помещу их в один фрагмент, содержащий список.

Я ищу много примеров, но это только listview в примере ACTIVITY.

Не могли бы вы помочь мне?

С наилучшими пожеланиями,

Tofuw

PS: Извините за мой плохой английский, я французский:/

EDIT

Вот мой код:

public class PhoneFrag extends ListFragment 
{ 
private List<Contact>listecontact=new ArrayList<Contact>(); 

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
} 

public void onActivityCreated(Bundle savedInstanceState, Context context) 
{ 
    super.onActivityCreated(savedInstanceState); 

    String[]values=new String[]{}; 

    Cursor phones=context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null); 

    while(phones.moveToNext()) 
    { 
     String name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
     String num=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

     Contact contact=new Contact(); 
     contact.setName(name); 
     contact.setNum(num); 

     listecontact.add(contact); 
    } 
    phones.close(); 

    ArrayAdapter<String>adapter=new ArrayAdapter<String>(getActivity(), android.R.layout.simple_expandable_list_item_2, listecontact); 
    setListAdapter(adapter); 
} 

У меня есть ошибка на третья последняя строка:

конструктор ArrayAdapter (FragmentActivity, INT, List) не определено

Можете ли вы помочь мне, пожалуйста?

Tofuw

+2

Почему бы просто не использовать ListFragment? Http: // StackOverflow.com/questions/6510550/android-listview-in-fragment – Neil

+0

так же, как в Activity. Создайте свой xml. Получить экземпляр ListView в его onCreateView (...) с помощью ListView lv = (ListView) fragmentRootView.findViewById (R.id.your_list_view); 'Я не вижу вашей проблемы –

+0

Здравствуйте, спасибо за ваш ответ! Я использую ListFragment :) – Tofuw

ответ

3

Получить фрагмент продлить ListFragment вместо Fragment .Если вы использовали или смотрели на примерах с ListActivity нет необходимости связывать этот фрагмент с файлом макета XML с помощью setContentView(layout) больше, Android создает реди-мэйд Fragment с ListView внутри него для ваших методов conveniance conveniance.Instead как setListAdapter(adapter) доступны вас.Однаки, в случае, если вы хотели бы получить доступ к экземпляру ListView использовать getListView() .The фрагмент, кажется, использует onActivityCreated сделать это:

Я предполагаю, что вы знаете фрагменты достаточно хорошо, чтобы понять, что this в ListActivity означает getActivity() в вашем ListFragment.

Вот код, который я нашел в Android Fragment Documentation:

public static class TitlesFragment extends ListFragment { 
boolean mDualPane; 
int mCurCheckPosition = 0; 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    // Populate list with our static array of titles. 
    setListAdapter(new ArrayAdapter<String>(getActivity(), 
      android.R.layout.simple_list_item_activated_1, Shakespeare.TITLES)); 

    // Check to see if we have a frame in which to embed the details 
    // fragment directly in the containing UI. 
    View detailsFrame = getActivity().findViewById(R.id.details); 
    mDualPane = detailsFrame != null && detailsFrame.getVisibility() == View.VISIBLE; 

    if (savedInstanceState != null) { 
     // Restore last state for checked position. 
     mCurCheckPosition = savedInstanceState.getInt("curChoice", 0); 
    } 

    if (mDualPane) { 
     // In dual-pane mode, the list view highlights the selected item. 
     getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
     // Make sure our UI is in the correct state. 
     showDetails(mCurCheckPosition); 
    } 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putInt("curChoice", mCurCheckPosition); 
} 

@Override 
public void onListItemClick(ListView l, View v, int position, long id) { 
    showDetails(position); 
} 

/** 
* Helper function to show the details of a selected item, either by 
* displaying a fragment in-place in the current UI, or starting a 
* whole new activity in which it is displayed. 
*/ 
void showDetails(int index) { 
    mCurCheckPosition = index; 

    if (mDualPane) { 
     // We can display everything in-place with fragments, so update 
     // the list to highlight the selected item and show the data. 
     getListView().setItemChecked(index, true); 

     // Check what fragment is currently shown, replace if needed. 
     DetailsFragment details = (DetailsFragment) 
       getFragmentManager().findFragmentById(R.id.details); 
     if (details == null || details.getShownIndex() != index) { 
      // Make new fragment to show this selection. 
      details = DetailsFragment.newInstance(index); 

      // Execute a transaction, replacing any existing fragment 
      // with this one inside the frame. 
      FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      if (index == 0) { 
       ft.replace(R.id.details, details); 
      } else { 
       ft.replace(R.id.a_item, details); 
      } 
      ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
      ft.commit(); 
     } 

    } else { 
     // Otherwise we need to launch a new activity to display 
     // the dialog fragment with selected text. 
     Intent intent = new Intent(); 
     intent.setClass(getActivity(), DetailsActivity.class); 
     intent.putExtra("index", index); 
     startActivity(intent); 
    } 
} 

}

Вы можете также использовать такие методы, как setEmptyText и setListShown для отображения сообщения в случае, если курсор не имеет ни одной строки и установите переключатель в видимость вашего спискаView соответственно. Кроме того, Loader Framework от Android поддерживается только с помощью фрагмента, а не из Activity в библиотеке поддержки.

+0

Спасибо за ваш ответ @ user2309862. Но теперь у меня другая проблема. Не могли бы вы мне помочь ? Я напишу свой код ниже и уточню детали. – Tofuw

Смежные вопросы