Android ScrollView & ListView

by 23:32:00 1 comments
最近面對的一個小問題就是如何在一個ScrollView 裹頭再放一個 ListView,  因為它們都有自己的Scroll Event 所以會出現 ScrollView 可以捲動但是 ListView 沒有反應.

雖然說Google 也不建議在 ScrollView 中再放 ListView 可是樣本是要這樣做沒辦法







最後解決方案是

Eclipse Project : TestListInScroll.rar
在ListView OnTouch Down 的時候 設計 target 為自己, MOVE 的時候 Scroll 自己 , UP 的時候 設回target 為 ScrollView

而ScrollView 的OnTouch 則要判斷target 是否為自己 如果不是就 停住不移動

以下是 Code:
package com.test.listinscroll;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.ScrollView;

public class TestListInScrollActivity extends Activity {

 private int scrollTarget = 0;
 private ListView lv1, lv2, lv3;
 private ScrollView sv;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        super.onCreate(savedInstanceState);
  setContentView(R.layout.list_in_scroll);
  
  ArrayList list = new ArrayList();
  
  for(int i = 0; i < 50; i++){
   list.add("Item");
  }
  
  ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, list);
  
  sv = (ScrollView)this.findViewById(R.id.scrollview1);
  
  lv1 = (ListView)this.findViewById(R.id.listView1);
  lv2 = (ListView)this.findViewById(R.id.listView2);
  lv3 = (ListView)this.findViewById(R.id.listView3);
  
  lv1.setAdapter(adapter);
  lv2.setAdapter(adapter);
  lv3.setAdapter(adapter);
  
  sv.setOnTouchListener(new OnTouchListener(){

   public boolean onTouch(View v, MotionEvent event) {
    if(scrollTarget != 0){
     return true;
    }
    return false;
   }
   
  });
  
  lv1.setOnTouchListener(new OnTouchListener(){

   public boolean onTouch(View v, MotionEvent event) {
    if(event.getAction() == MotionEvent.ACTION_DOWN){
     scrollTarget = 1;
    }else if(event.getAction() == MotionEvent.ACTION_MOVE){
     lv1.scrollBy(0, 1);
    }else if(event.getAction() == MotionEvent.ACTION_UP){
     scrollTarget = 0;
    }
    return false;
   }
   
  });
  
  lv2.setOnTouchListener(new OnTouchListener(){

   public boolean onTouch(View v, MotionEvent event) {
    if(event.getAction() == MotionEvent.ACTION_DOWN){
     scrollTarget = 2;
    }else if(event.getAction() == MotionEvent.ACTION_MOVE){
     lv2.scrollBy(0, 1);
    }else if(event.getAction() == MotionEvent.ACTION_UP){
     scrollTarget = 0;
    }
    return false;
   }
   
  });
  
  lv3.setOnTouchListener(new OnTouchListener(){

   public boolean onTouch(View v, MotionEvent event) {
    if(event.getAction() == MotionEvent.ACTION_DOWN){
     scrollTarget = 3;
    }else if(event.getAction() == MotionEvent.ACTION_MOVE){
     lv3.scrollBy(0, 1);
    }else if(event.getAction() == MotionEvent.ACTION_UP){
     scrollTarget = 0;
    }
    return false;
   }
   
  });
    }
}
佈局XML


    

        

            
            

            
            

            
            
        
    


1 comment: