Я пытаюсь написать тестовое приложение, состоящее из нескольких фрагментов.
Один фрагмент должен содержать список всех исполнителей музыки с устройства.
Каждый элемент этого списка является 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.
Для Android требуется разделение представления от данных, поскольку оно перерабатывает представления. Гораздо лучше абстрагировать свои взгляды от базовых данных, потому что вы хотите, чтобы представление ** отображало ** ваши данные, а не быть. Эта практика применяется на многих языках программирования и является репрезентативной для подхода модели-зрения-контроллера. –