2014-01-07 3 views
2

나는 목록보기가있는 AndroidSlidingUpPanel을 보유하고 있습니다. 내 문제는 창이 확장되어 있고 ListView를 스크롤하려고하면 창이 대신 스크롤됩니다. onInterceptTouchEvent를 재정의하고 특정 영역을 MotionEvent.ACTION_DOWN (또는 이와 비슷한 것)으로 설정해야한다는 것을 알았지 만, 실제로이 부분을 잃어 버렸습니다.AndroidSlidingUpPanel에서 ListView가 스크롤되지 않음

당신은 내가이 문제를 해결하는 방법을 도와하고 말해 주시겠습니까, 내 코드는 다음과 같습니다

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context=".MainActivity" > 

<com.sothree.slidinguppanel.SlidingUpPanelLayout 
    xmlns:sothree="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/sliding_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    sothree:collapsedHeight="40dp" 
    sothree:dragView="@+id/name" 
    sothree:shadowHeight="1dp" > 

    <FrameLayout 
     android:id="@+id/content_frame" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" > 



    </FrameLayout> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="#eee" 
     android:clickable="true" 
     android:focusable="false" > 

     <TextView 
      android:id="@+id/name" 
      android:layout_width="match_parent" 
      android:layout_height="40dp" 
      android:layout_centerHorizontal="true" 
      android:text="" 
      android:textSize="14sp" /> 

     <ListView 
      android:id="@+id/lv_menu" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:paddingTop="40dp" /> 
    </RelativeLayout> 
</com.sothree.slidinguppanel.SlidingUpPanelLayout> 

그리고 MainActivity :

public class MainActivity extends Activity implements PanelSlideListener, OnItemClickListener { 
public static final String SAVED_STATE_ACTION_BAR_HIDDEN = "saved_state_action_bar_hidden"; 

private ListView _menuListView; 
private SlidingUpPanelLayout _slideUpPane; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); 
    setContentView(R.layout.activity_main); 

    _slideUpPane = (SlidingUpPanelLayout) findViewById(R.id.sliding_layout); 

    _slideUpPane.setShadowDrawable(getResources().getDrawable(R.drawable.above_shadow)); 
    _slideUpPane.setAnchorPoint(0.2f); 
    _slideUpPane.setPanelSlideListener(this); 

    ArrayList<MenuItem> menuItems = new ArrayList<MenuItem>(); 
    menuItems.add(new MenuItem("Menu Item")); 
    menuItems.add(new MenuItem("Menu Item")); 
    menuItems.add(new MenuItem("Menu Item")); 
    menuItems.add(new MenuItem("Menu Item")); 
    menuItems.add(new MenuItem("Menu Item")); 
    menuItems.add(new MenuItem("Menu Item")); 
    menuItems.add(new MenuItem("Menu Item")); 
    menuItems.add(new MenuItem("Menu Item")); 
    menuItems.add(new MenuItem("Menu Item")); 
    menuItems.add(new MenuItem("Menu Item")); 
    menuItems.add(new MenuItem("Menu Item")); 
    menuItems.add(new MenuItem("Menu Item")); 
    menuItems.add(new MenuItem("Menu Item")); 

    _menuListView = (ListView) findViewById(R.id.lv_menu); 
    _menuListView.setAdapter(new MenuAdapter(this, menuItems)); 
    _menuListView.setOnItemClickListener(this); 


    boolean actionBarHidden = savedInstanceState != null ? 
      savedInstanceState.getBoolean(SAVED_STATE_ACTION_BAR_HIDDEN, false): false; 
    if (actionBarHidden) { 
     getActionBar().hide(); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public void onPanelSlide(View panel, float slideOffset) { 
    Log.i(TAG, "onPanelSlide, offset " + slideOffset); 
    if (slideOffset < 0.2) { 
     if (getActionBar().isShowing()) { 
      getActionBar().hide(); 
     } 
    } else { 
     if (!getActionBar().isShowing()) { 
      getActionBar().show(); 
     } 
    } 

} 

@Override 
public void onPanelCollapsed(View panel) { 
    Log.i(TAG, "onPanelCollaped"); 
} 

@Override 
public void onPanelExpanded(View panel) { 
    Log.i(TAG, "onPanelExpanded"); 
} 

@Override 
public void onPanelAnchored(View panel) { 
    Log.i(TAG, "onPanelAnchored"); 
} 

@Override 
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
    _slideUpPane.collapsePane(); 
} 

}

나는 이것들을 사용하려고 노력하지만 그것을하는 법을 알 수 없었다 : ,763,210 ListView in SlidingUpPanel is not scrollable

답변

9

나는이 문제에 대한 아주 쉬운 해결책을 발견 : 필요한 유일한 변화가 ListView를위한 새로운 onTouchListener를 정의하는 것입니다.

의 변화는 것과 같아야합니다 : 나는 잠시 동안 같은 문제로보고 있었다

_menuListView.setOnTouchListener(new OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      int action = event.getAction(); 
      switch (action) { 
      case MotionEvent.ACTION_DOWN: 
       // Disallow ScrollView to intercept touch events. 
       v.getParent().requestDisallowInterceptTouchEvent(true); 
       break; 

      case MotionEvent.ACTION_UP: 
       // Allow ScrollView to intercept touch events. 
       v.getParent().requestDisallowInterceptTouchEvent(false); 
       break; 
      } 

      // Handle ListView touch events. 
      v.onTouchEvent(event); 
      return true; 
     } 
    }); 
+2

처음에는이 솔루션을 사용했지만 부모가 'MotionEvent'를 가로 챌 필요가 있기 때문에 제대로 작동하지 않았습니다. AndroidSlidingUpPanel의 전체 onInterceptTouchEvent에 댓글을 달았습니다. 이제는 매력처럼 작동합니다. 나는 그들이 왜 ~ 80 줄의 코드를 추가하는지 궁금 해서요. – seb

+0

@galvan 나는 같은 일을했지만 listview를 스크롤 할 수 없다. 더 할 일이 있거나 문제가 어디에 있습니까? –

+0

@iDroidExplorer 귀하의 목록 구조가 동일하므로 동일한 레이아웃 구조인지 확인하십시오. – galvan

2

. 다음을 사용하십시오 :

관련 문제