Как изменить ListView ListFragment после использования ViewFlipper showNext()?

У меня есть ListFragment с пользовательским макетом. Я пытаюсь переключить свой ListView в тот же макет с помощью анимации ViewFlipper. Это действительно работает, но поскольку я использую ArrayAdapter для заполнения обоих ListView, setListAdapter(), похоже, не обновляет мой второй ListView, даже если я использую его после вызова showNext(). Как мне сообщить моему ListFragment, что я изменил представление? Это вообще возможно?

Это мой пользовательский макет, и, поскольку я также использую пользовательские ListView, мне нужно использовать android:id="@id/android:list" для обоих списков.

   <LinearLayout>
        <TextView/>

        <ListView 
            android:id="@id/android:list"
            android:layout_width="match_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
            android:drawSelectorOnTop="false"/>        
    </LinearLayout>

    <LinearLayout>    
        <TextView/>

        <ListView 
            android:id="@id/android:list"
            android:layout_width="match_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
            android:drawSelectorOnTop="false"/>        
    </LinearLayout>

</ViewFlipper>

И это часть моего кода:

headerFlipper = (ViewFlipper)getActivity().findViewById(R.id.viewFlipper);
headerFlipper.showNext();

// at this point a simple getListView() returns the same first ListView object.

// this changes the first ListView (not visible anymore)
// how to change the second one?
setListAdapter(new ArrayAdapter<DummyContent.DummyMessage>(getActivity(),
        android.R.layout.simple_list_item_activated_1,
        android.R.id.text1, DummyContent.MESSAGES));

Любой совет? Заранее спасибо.


person elmango    schedule 24.09.2013    source источник


Ответы (1)


У вас есть два элемента с одинаковым идентификатором в вашем представлении, поэтому активность будет использовать только один. Чтобы сделать это таким образом, вам нужно изменить текущий ListActivity на FragmentActivity, а затем создайте два отдельных действия ListFragment для обработки каждый список.

Имейте в виду, что некоторые из этих имен классов могут меняться в зависимости от того, используете ли вы библиотеку поддержки, но в целом между ними очень мало различий.

Для макетов просто поместите два LinearLayouts для фрагментов в их собственный файл xml и включите их в xml viewFlipper.

viewflipper.xml

<?xml version="1.0" encoding="utf-8"?>
<ViewFlipper xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/viewFlipper"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <include 
        android:id="@+id/fragListOne"  
        layout="@layout/listfragmentone" />

    <include 
        android:id="@+id/fragListTwo"  
        layout="@layout/listfragmenttwo" />

</ViewFlipper>

то для каждого фрагмента вы можете использовать что-то вроде:

listfragmentone и listfragmenttwo

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

    <ListView android:id="@+id/android:list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#00FF00"
            android:layout_weight="1"
            android:drawSelectorOnTop="false"/>

    <TextView android:id="@id/android:empty"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#FF0000"
            android:text="No data"/>
</LinearLayout>

Что касается кода, у вас будет основное действие, которое координирует данные и все остальное, и два фрагмента списка, которые обрабатывают каждый список отдельно. Основная активность также должна будет отслеживать, какая из них видна и т. д.

Основная деятельность - расширяет FragmentActivity

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

    setContentView(R.id.viewFlipper);

    // use fragment manager to see which fragments are instantiated
    // and available, then reuse any available in case of
    // orientation change

    FragmentManager.enableDebugLogging(true)
    FragmentManager fragManager = getSupportFragmentManager();
    ListFragmentOne fragOne = fragManager.findFragmentById("frag one tag");

    // if fragOne is null add a new instance via an add transaction
    // etc.
}

Действия фрагмента, расширяющие ListFragment, должны быть похожи на обычные действия списка, за исключением того, что вы будете использовать onCreateView вместо onCreate.

person Jon    schedule 24.09.2013