2015-02-11 1 views
0

Контекст:Как вы подключаете CustomListAdapter к фрагменту списка в Activity?

  1. У меня есть деятельность, состоящую из фрагмента, где есть форма для ввода даты и номера рейса. Других фрагментов нет.
  2. При нажатии кнопки выполняется запрос к веб-сервису.
  3. A List Объектов полета возвращается с webservice.
  4. Пользовательский ArrayAdapter создан для каждой строки в спискеFragment.
  5. Показать результаты в ListFragment в той же самой деятельности по интерфейсу.

FlightResultAdapter.java:

public class FlightResultAdapter extends ArrayAdapter<Flight>{ 
    public FlightResultAdapter(Context context, List<Flight> flights) { 
     super(context, R.layout.item_flight, flights); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     Flight flight = getItem(position); 

     if (convertView == null){ 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_flight, parent, false); 
     } 
//Set the content of the custom row layout 
     TextView tvFlightNum = (TextView) convertView.findViewById(R.id.tvFlightNum); 
     tvFlightNum.setText(flight.getNumber()); 

     return convertView; 
    } 
} 

Примечание: ListFragment имеет расположение по умолчанию, который состоит из одного списка.Source

Так что мне не нужен файл макета для списка.

MyActivity.java: список объектов (flightList.getFlight) используется для создания CustomListAdapter. Этот код находится внутри функции, которая запускается на OnClick.

FlightResultAdapter adapter = 
new FlightResultAdapter(getApplicationContext(), flightList.getFlight()); 

FlightFragment.java

public class FlightFragment extends ListFragment { 

    private List<Flight> flight_items; 

    public FlightFragment() { 
    } 

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

     flight_items = new ArrayList<Flight>(); 

     //Initialise the list adapter and set 
     FlightResultAdapter adapter = new FlightResultAdapter(getActivity(), flight_items); 
     setListAdapter(adapter); 
    } 

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

     Flight flight = flight_items.get(position); 

     Toast.makeText(getActivity(), flight.getNumber(), Toast.LENGTH_LONG).show(); 
    } 
} 

Так что я не получаю, как Покажите FlightFragment на MyActivity. Кроме того, как соединить его, так что отображаются результаты: Я думаю, setListAdapter используется?

Обновление: Подключение фрагмента к деятельности 1. Добавить FrameLayout в макет деятельности или другой фрагмент макета

<FrameLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/fragment_container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

2. Используйте FragmentManager для вызова фрагмента программно:

//Create the adapter here 
     FlightResultAdapter adapter = new FlightResultAdapter(getApplicationContext(), flightList.getFlight()); 

     //Get the Fragment here and set the ListAdapter 
     FlightFragment ff = new FlightFragment(); 
     // In case this activity was started with special instructions from an 
     // Intent, pass the Intent's extras to the fragment as arguments 
     ff.setArguments(getIntent().getExtras()); 

     ff.setListAdapter(adapter); 

     if (findViewById(R.id.fragment_container) != null) { 

      //Send the Data to the fragment - Need Help Here 
      Bundle bundle = new Bundle(); 

      //Show the Fragment 
      FragmentManager fragmentManager = getFragmentManager(); 
      FragmentTransaction fragmentTransaction = 
        fragmentManager.beginTransaction(); 
      fragmentTransaction.add(R.id.fragment_container, ff); 
      fragmentTransaction.commit(); 
     } 

Так что метод Fragment's OnCreate вызывается, но список пуст, потому что я не передаю объект Flight для фрагмента , Как я могу это сделать?

+1

Вы добавляете 'FlightFragment 'to' MyActivity'? –

+0

@ ρяσѕρєяK Нет, я этого не делаю, это то, с чем я борюсь – surfer190

+1

см. Следующий пост [Как добавить фрагмент в действие с программно созданным контентом] (http://stackoverflow.com/questions/5159982/how -do-i-add-a-fragment-to-the-activity-with-a-softwareatically-created-content-v), вероятно, поможет вам –

ответ

1

Как передать объект списка в Фрагмент?

Потому что List содержит Flight изготовленный под заказ объект класса. поэтому передать его невозможно.

List<Flight> Чтобы передать объект:

1. Внесите Serializable в Flight класс.

2. Использование Bundle.putSerializable для отправки объекта от деятельности к FlightFragment:

Bundle bundle = getIntent().getExtras(); 
bundle.putSerializable("flightList", flightList.getFlight()); 
ff.setArguments(bundle); 
... 

3. В FlightFragment класса переопределение onCreateView метод и метод getArguments:

@Override 
public View onCreateView(LayoutInflater inflater, 
      ViewGroup container, Bundle savedInstanceState) { 
    Bundle args = getArguments(); 
    List<Flight> flightList=(List<Flight>)args.getSerializable("flightList"); 
.... 
return super.onCreateView(inflater, container, savedInstanceState); 
} 
+0

Отлично, он работает как шарм. Спасибо. Прошу прокомментировать, если вы считаете, что есть более простой или элегантный способ выполнить всю задачу. – surfer190

+0

@StevieG: currenlty я знаю способ, который я сказал в своем ответе спасибо –

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