2012-11-28 2 views
0

몇 개의 조각으로 구성된 테스트 응용 프로그램을 작성하려고합니다.
하나의 조각에는 장치의 모든 음악 아티스트의 listView가 포함되어야합니다.
이 목록의 각 항목은 다음과 같이있는 LinearLayout 아티스트 이름을 가진 텍스트 뷰와 그 아래 빈의 LinearLayout부터 시작이다 :
목록이 레이아웃입니다 :안드로이드 : Item으로 LinearLayouts를 확장 한 ListView가 중복 됨

<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이 다른 아티스트 이름으로 표시된다는 것입니다.
example

이 조각을 어떻게 구현해야할까요? 그러나 나는 또한이 행동이 왜 발생하는지 알고 싶습니다.

감사합니다.
Maor.

답변

0

여기 솔루션을 찾았습니다. 뷰가 다른 데이터를 보유하지 않아야합니다. 스크롤하면 다른 데이터에 사용되기 때문입니다.

각 가상 뷰 상태를 저장하는 외부 데이터 구조를 유지하는 것이 좋은 프로그래밍이 아니라고 생각합니다. 이 데이터를 보관하는 방법이 있습니까? (이걸 내가 지금 보게 될 것이다)

+0

안드로이드는보기를 재활용하기 때문에 데이터에서보기를 분리해야한다. 뷰를 ** 데이터 **로 표현하기를 원하기 때문에 기본 데이터에서 뷰를 추상화하는 것이 훨씬 낫습니다. 이 방법은 많은 프로그래밍 언어에서 채택되며 모델 - 뷰 - 컨트롤러 접근 방식을 대표합니다. –