1

같은 활동으로 두 개의 ListView를 집어 넣으려고 피클에 빠져 들었습니다. 표준 (수직) LinearLayout에 포함 된 두 개의 개별 ListFragments를 사용하여 작동합니다.두 ListView로 스크롤하면서 LinearLayout을 채우려 고 시도하는 대신

문제는 두 목록이 함께 화면보다 길고 두 번째 목록이 부분적으로 숨겨져 있다는 것입니다. 시각적으로 사용자는 전체 화면을 드래그하여 두 번째 목록을 공개하려고합니다. 그러나 두 목록에는 내부 스크롤이 있으며 전체 화면을 하나의 항목으로 스크롤 할 수 없습니다.

운 좋게도 실제로 목록에는 매우 적은 항목이 포함되어 있습니다 (평균 5 개씩). 이론적으로, 대신에 두 개의 LinearLayouts 컨테이너를 채울 수 있습니다. 문제는 목록에 표시되는 데이터가 커서에서오고 동적이라는 것입니다. CursorAdapter의 newView() 및 bindView() 메서드를 알고 있지만 ListView 대신 LinearLayout 컨테이너에 어떻게 어댑터를 연결할 수 있는지 잘 모르겠습니다. 나는. CursorAdapter는 커서에서 찾은 5 개의 항목 중 5 개의 행 항목을 만들어야한다는 것을 어떻게 알 수 있습니까? LinearLayout 컨테이너에 항목을 생성하고 커서 항목을 반복하는 루프를 어디에서 만들 수 있습니까? Cursor의 데이터가 변경 될 때 LinearLayout의 내용을 새로 고치는 방법은 무엇입니까? 모든 예제에서는 ListActivity에서 제공하는 ListView에 이러한 문제를 깔끔하게 마무리했지만 ListView를 사용할 수 없습니다!

혼란스러워! 마누

편집

: 여기는 breceivemail 제안 다음 (조각) 활동의 XML 레이아웃입니다. 원래의 LinearLayout 컨테이너는 breceivemail이 제안하기 전에 주석 처리되었습니다. 또한 전체 활동이 차례대로 TabHost에 포함되어 있음을 유의해야합니다. 그러나이 문제가 현재 진행중인 문제에 어떤 차이가 있는지는 알 수 없습니다.

<?xml version="1.0" encoding="utf-8"?> 

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"> 

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

    <TextView android:id="@+id/title" 
       android:textSize="36sp" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:text="@string/SelectPlayer"/> 

    <TextView android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:text="@string/Playing" 
       android:textSize="18sp" 
       android:textStyle="bold" 
       android:textColor="#000000" 
       android:background="#999999"/> 

    <fragment android:name="com.myDomain.myApp.PlayerListFragment" 
       android:id="@+id/playing" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" /> 

    <TextView android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:text="@string/Reserve" 
       android:textSize="18sp" 
       android:textStyle="bold" 
       android:textColor="#000000" 
       android:background="#999999"/> 

    <fragment android:name="com.myDomain.myApp.PlayerListFragment" 
       android:id="@+id/reserve" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" /> 

</LinearLayout>  

</ScrollView> 
+0

단지 레이아웃을 만드는 것이 더 나은 솔루션이 아니므로 두 개의 ListView가 화면 크기에 맞습니까? – kaspermoerch

+0

그것은 공정한 코멘트 @ KasperMoerch이지만, 목록 항목의 높이는 설계 상 비정상적으로 큽니다. 목록 항목은 특히 첫 번째 목록에있는 항목을 빠르게 탭해야합니다. 더 큰 항목 일수록 더 빨리 도달하고 상호 작용하는 것이 UI 원칙입니다. – manu3d

+0

이것은 모두 공평합니다. 그러나 ListView의 일반적인 점은 스크롤 할 수 있다는 것입니다. 즉, 목록에서 두 개의 ListView가있는 경우 필요한 절반으로 스크롤해야한다는 것을 의미합니다. 각 화면. 나는 당신이 멋진 게임을 만들고 있다는 인상을받습니다. 비판이나 저를 완고한 것으로 보지 말아야합니다. 저는 단순히 UI 디자인의 선택에 도전하려고합니다. 더 나은 해결책이 될 수도 있고 없을 수도 있습니다. – kaspermoerch

답변

0

listViews를 세로 스크롤로 배치하십시오. 다음과 같은 트릭에 의해 수직 스크롤 안에서 스크롤 할 수있는 listView를 가질 수 있습니다. 다음 코드를 사용하여 즐기십시오!

private int listViewTouchAction; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //... 

     setListViewScrollable(myListView1); 
     setListViewScrollable(myListView2); 
    } 

    private void setListViewScrollable(final ListView list) { 
      list.setOnTouchListener(new OnTouchListener() { 
       @Override 
       public boolean onTouch(View v, MotionEvent event) { 
        listViewTouchAction = event.getAction(); 
        if (listViewTouchAction == MotionEvent.ACTION_MOVE) 
        { 
         list.scrollBy(0, 1); 
        } 
        return false; 
       } 
      }); 
      list.setOnScrollListener(new OnScrollListener() { 
       @Override 
       public void onScrollStateChanged(AbsListView view, 
         int scrollState) { 
       } 

       @Override 
      public void onScroll(AbsListView view, int firstVisibleItem, 
        int visibleItemCount, int totalItemCount) { 
       if (listViewTouchAction == MotionEvent.ACTION_MOVE) 
       { 
        list.scrollBy(0, -1); 
       } 
      } 
     }); 
    } 

listViewTouchAction은 전역 정수 값입니다.

+0

친애하는 @breceivemail, 감사합니다. 불행히도 이것은 작동하지 않습니다. 코드는 기능적이지만 레이아웃과 함께 원래 게시물에 추가하면 두 목록보기가 훨씬 짧아지고 내부 스크롤이 유지됩니다. 단일보기로 스크롤하지 않습니다. 또한, 하나의 목록을 드래그 할 때마다 아이템보기가 점점 줄어들고 결국 사라지는 모든 항목이 어떻게 든 숨겨집니다. 질문 : listViewTouchAction 변수를 작성할 때 Activity-global 또는 Application-global을 의미합니까? – manu3d

+0

저는 Asus Eee, Gallagxy 탭 및 모든 에뮬레이터에서 테스트했습니다. – breceivemail

관련 문제