代码之家  ›  专栏  ›  技术社区  ›  Daniel Benedykt

Android-ListView在Gallery中使滚动不顺畅

  •  6
  • Daniel Benedykt  · 技术社区  · 14 年前

    我实现了一个库,在其中我有许多从左到右的列表视图。 在listview中,当我在图库上滚动时,有时会有一些跳跃。

    注意:gallery使用适配器找出要显示的内容,然后基于适配器创建listview

    谢谢

    4 回复  |  直到 14 年前
        1
  •  2
  •   CommonsWare    14 年前

    其他可滚动项中的可滚动项往往有问题。我并不感到惊讶,这不好工作。

        2
  •  8
  •   Jonathan Schneider    12 年前

    public class BetterGallery extends Gallery {
        private boolean scrollingHorizontally = false;
    
        public BetterGallery(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        public BetterGallery(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public BetterGallery(Context context) {
            super(context);
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            super.onInterceptTouchEvent(ev);
            return scrollingHorizontally;
        }
    
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            scrollingHorizontally = true;
            return super.onScroll(e1, e2, distanceX, distanceY);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            switch(event.getAction()) {
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                scrollingHorizontally = false;
            }
    
            return super.onTouchEvent(event);
        }
    }
    

    另外,在实现库的活动中设置如下内容:

        ListView listView = (ListView) view.findViewById(R.id.users);
        listView.setAdapter(userListAdapter);
        listView.setOnTouchListener(new OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
            galleryView.onTouchEvent(event);
            return false;
            }           
        });
    

    最后,将onTouchEvent()添加到活动本身:

    @Override
    public boolean onTouchEvent(MotionEvent event) {
    return galleryView.onTouchEvent(event);
    }
    

    最后一个音符。。。在完全实现了这一点之后,我发现从可用性的角度来看,用一个名为AdaptableViewAnimator的自定义类来扩展ViewAnimator会更好,当然,这个自定义类只是嵌入了一些适配器功能,并将ListView嵌入其中。它不像库中的ListView那样四处浮动。

        3
  •  1
  •   DonGru    13 年前

    我也有同样的问题。而且解决方法并不简单。

      listView.setFocusableInTouchMode(false);

    1. 使用OnInterceptTouchEvent从您的孩子那里获取触摸事件。在你画廊的onScroll和onTouchEvent上做些修改

      OnItemSelectedListener mOnItemSelected = new OnItemSelectedListener()
      {   
          @Override
          public void onItemSelected(AdapterView<?> parent, View view,
                  int position, long id)
          {
            view.requestFocusFromTouch();
          }
          @Override
          public void onNothingSelected(AdapterView<?> parent)
          {               
          }
      };
      
      @Override
      public boolean onInterceptTouchEvent(MotionEvent ev) {
          onTouchEvent(ev);
          return scrollingHorizontally;
      }
      
      @Override
      public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
          if(Math.abs(distanceX)>Math.abs(distanceY) || scrollingHorizontally == true){
              scrollingHorizontally = true;
              super.onScroll(e1, e2, distanceX, distanceY);
          }
          return scrollingHorizontally;
      }
      
      @Override
      public boolean onTouchEvent(MotionEvent event) {
          switch(event.getAction()) {
          case MotionEvent.ACTION_UP:
          case MotionEvent.ACTION_CANCEL:
              scrollingHorizontally = false;
              break;
          default:
                  break;
          }
          super.onTouchEvent(event);
          return scrollingHorizontally;
      }
      
        4
  •  1
  •   DaveShaw Thishin    12 年前

    listView.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);