2012-11-28 3 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 заполняет все эти имена альбомов исполнителя. проблема заключается в том, что, как только линейкаLayout прокручивается из поля зрения, она снова отображается с другого края представления (PacMan Style), как если бы была заполнена линейная линия списка элементов списка. Это происходит каждый раз, когда расширенный макет выходит из поля зрения. смешная часть состоит в том, что несколько раз при прокрутке назад, linearLayout отображается под другим именем исполнителя.
example

Я буду рад услышать, как мне реализовать этот фрагмент. Но я также хочу знать, почему это поведение вызвано.

Thanks,
Maor.

ответ

0

Я нашел решение здесь, в stackoverflow.com Похоже, что представление не должно содержать никаких данных, поскольку оно используется для разных данных, когда я прокручиваю назад и четвертое.

Я думаю, что наличие внешней структуры данных для сохранения каждого состояния виртуального представления не является хорошим программированием. есть способ сохранить эти данные в любом случае? (для этого я буду смотреть сейчас)

+0

Для Android требуется разделение представления от данных, поскольку оно перерабатывает представления. Гораздо лучше абстрагировать свои взгляды от базовых данных, потому что вы хотите, чтобы представление ** отображало ** ваши данные, а не быть. Эта практика применяется на многих языках программирования и является репрезентативной для подхода модели-зрения-контроллера. –