0

我正在尝试编写一个由几个片段组成的测试应用程序。
一个片段应包含设备中所有音乐艺术家的列表视图。
这个列表的每个项目都是一个线性布局,以一个带有艺术家姓名的 TextView 开头,下面是一个空的线性布局,如下所示:
该列表是这个布局的:

<ListView
    android:id="@+id/artistsLists"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true" >
</ListView>

每个项目的布局如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/artistName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        android:text="" />

    <LinearLayout
        android:id="@+id/artistsAlbums"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >
    </LinearLayout>

</LinearLayout>

我通过以下方式使用 SimpleCursorAdapter 填充列表:

public class MusicTabFragment extends Fragment 
{

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    View view = inflater.inflate(R.layout.fragment_music_tab,container,false);

    Cursor artistsCursor = getActivity().getContentResolver().query(Audio.Artists.EXTERNAL_CONTENT_URI, new String[]{Audio.Artists.ARTIST,Audio.Artists._ID}, null, null,Audio.Artists.ARTIST);

    SimpleCursorAdapter adapter = new SimpleCursorAdapter(view.getContext(), R.layout.music_artist_list_item_layout, artistsCursor, new String[]{Audio.Artists.ARTIST},new int[]{R.id.artistName},0 );

    ListView lView = (ListView)view.findViewById(R.id.artistsLists);
    lView.setAdapter(adapter);
    lView.setOnItemClickListener(new OnItemClickListener()
        {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
            {
                ((LinearLayout)view.findViewById(R.id.artistsAlbums)).removeAllViews();


                Cursor albumsCursor = getActivity().getContentResolver().query(Audio.Artists.Albums.getContentUri("external", ((Cursor)parent.getItemAtPosition(position)).getLong(1)), new String[]{Audio.Albums.ALBUM, Audio.Albums._ID},null,null,null);


                LinearLayout artistLayout = (LinearLayout)view.findViewById(R.id.artistsAlbums);

                for(albumsCursor.moveToFirst();!albumsCursor.isAfterLast();albumsCursor.moveToNext())
                {
                    View albumView = LayoutInflater.from(view.getContext()).inflate(android.R.layout.simple_list_item_1,artistLayout,false);
                    ((TextView)albumView.findViewById(android.R.id.text1)).setText(albumsCursor.getString(0));
                    artistLayout.addView(albumView);
                }

                Log.d("POPULATE","populated again!");
                albumsCursor.close();
            }
        });



    return view;
}
}

这工作得很好。当我单击艺术家姓名时,线性布局会填充所有此艺术家专辑名称。问题是,一旦 linearLayout 滚动出视图,它会再次从视图的另一边缘(PacMan 样式)显示,就好像另一个列表项的 linearLayout 已填充一样。每次扩展的布局消失时都会发生这种情况。有趣的是,有时向上滚动时,linearLayout 会以不同的艺术家名称显示。
例子

我很高兴听到我应该如何实现这个片段。但我也想知道为什么会导致这种行为。

谢谢,
毛尔。

4

1 回答 1

0

我在 stackoverflow.com 找到了解决方案 看来视图不应该保存任何数据,因为当我向后滚动和第四次滚动时它被用于不同的数据。

I think holding an external data structure to save each virtual view state is not nice programming. is there a way to keep this data anyway? (for this i will be looking now)

于 2012-12-01T08:57:27.333 回答