2013-03-05 97 views
1

实际上我使用的是嵌套的listview。父列表视图使用自定义适配器和普通的子视图列表视图。我知道我可以使用expandable list view。但是在我的场景中,子项目处理起来更复杂。有很多组件。禁用滚动的listview不起作用

这是我试过的,点击父列表中的一个按钮显示相应的子列表项。这工作正常。但唯一的问题是滚动。我想滚动子列表,但父列表正在滚动。我试过setScrollContainer(false)setClickable(false)(刚刚尝试过),但没有用。

这是我的代码。

activity_main.xml中

<RelativeLayout 
    android:id="@+id/parent_rel" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:paddingBottom="@dimen/activity_vertical_margin" > 

    <Button 
     android:id="@+id/b_view" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="15dp" 
     android:text="View" /> 

    <TextView 
     android:id="@+id/parent_txt" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBaseline="@+id/b_view" 
     android:layout_alignBottom="@+id/b_view" 
     android:layout_alignParentLeft="true" 
     android:layout_marginLeft="96dp" 
     android:text="TextView" /> 
</RelativeLayout> 

<RelativeLayout 
    android:id="@+id/child_view" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignLeft="@+id/parent_rel" 
    android:layout_below="@+id/parent_rel" 
    android:visibility="gone" > 

    <ListView 
     android:id="@+id/ch_listView" 
     android:layout_width="match_parent" 
     android:layout_height="150dp" 
     android:background="#000000" > 
    </ListView> 
</RelativeLayout> 

MainActivity.java

公共类MainActivity延伸ListActivity {

ListView lv; 
String[] prnt_items = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" }; 
boolean isViewing = false; 
RelativeLayout layout; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    lv = getListView(); 
    lv.setCacheColorHint(Color.parseColor("#00000000")); 
    lv.setAdapter(new ParentItems()); 

} 

class ParentItems extends BaseAdapter { 

    @Override 
    public int getCount() { 
     return prnt_items.length; 
    } 

    @Override 
    public Object getItem(int position) { 
     return prnt_items[position]; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     final View p_v = getLayoutInflater().inflate(
       R.layout.activity_main, parent, false); 

     TextView tv = (TextView) p_v.findViewById(R.id.parent_txt); 

     tv.setText(prnt_items[position]); 
     Button sub_view = (Button) p_v.findViewById(R.id.b_view); 

     sub_view.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       if (!isViewing) { 
        lv.setScrollContainer(false); 
        //lv.setClickable(false); 
        isViewing = !isViewing; 
        layout = (RelativeLayout) p_v.findViewById(R.id.child_view); 
        layout.setVisibility(View.VISIBLE); 
        ListView c_lv = (ListView) p_v.findViewById(R.id.ch_listView); 
        c_lv.setAdapter(new ArrayAdapter<String>(
          getApplicationContext(), 
          android.R.layout.simple_list_item_1, 
          new String[] { "Hello", "Hai", "Oops!!!" })); 
        c_lv.setOnItemClickListener(new OnItemClickListener() { 

         @Override 
         public void onItemClick(AdapterView<?> arg0,View arg1, int arg2, long arg3) { 
          Toast.makeText(getApplicationContext(), 
            "Click @ " + arg2, Toast.LENGTH_SHORT) 
            .show(); 
         } 

        }); 
       } 
       else{ 
        if(layout !=null){ 
         isViewing = !isViewing; 
         lv.setScrollContainer(true); 
         //lv.setClickable(true); 
         layout.setVisibility(View.GONE); 
        } 
       } 
      } 
     }); 

     return p_v; 
    } 
} 

}

欣赏的帮助。

谢谢。

回答

13

当您将视图与滚动功能在另一视图中进行滚动时,会出现问题。

这里是东西,你应该与内部列表视图

ListView lv = (ListView)findViewById(R.id.myListView); // your listview inside scrollview 
lv.setOnTouchListener(new ListView.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; 
     } 
    }); 

它禁用父的滚动当孩子触摸尝试。

+0

哇!惊人。有效。谢谢Aashish。 – Aswin 2013-03-05 12:23:25