2012-11-28 28 views
0

我想寫一個測試應用程序,由幾個片段組成。
一個片段應該包含設備中所有音樂藝術家的列表視圖。
這個列表中的每個項目是一個的LinearLayout開始與藝術家的名字一個TextView和下一個空的LinearLayout如下:
名單是這樣的佈局:Android:ListView與擴展LinearLayouts作爲項目導致重複

<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會填充所有這些藝術家專輯名稱。 問題是,一旦linearLayout從視圖中滾動出來,它就會從視圖的另一個邊(PacMan樣式)再次顯示,就好像另一個列表項的linearLayout被填充一樣。 每當展開的佈局不見時,就會發生這種情況。有趣的部分是有時滾動時,linearLayout顯示在不同的藝術家名下。
example

我很高興聽到我應該如何實現這個片段。但我也想知道爲什麼會造成這種行爲。

謝謝,
Maor。

回答

0

我在這裏找到了解決方案stackoverflow.com 看來,該視圖不應該包含任何數據,因爲當我向後滾動和向後滾動時,它被用於不同的數據。

我覺得拿着外部數據結構來保存每個虛擬視圖狀態並不是很好的編程。有沒有辦法保存這些數據呢? (爲此我現在正在尋找)

+0

Android需要從數據中分離視圖,因爲它可以回收視圖。將視圖從基礎數據中抽象出來會好得多,因爲您希望視圖代表**數據,而不是代表**。這種做法被許多編程語言採用,並且是模型 - 視圖 - 控制器方法的代表。 –