【问题标题】:Getting row position of listview on swipe在滑动时获取列表视图的行位置
【发布时间】:2012-01-13 01:25:12
【问题描述】:

我知道在here 之前有人问过这类问题。 我已经尝试过两种手势检测器:

 wholelistview.setOnTouchListener(new View.OnTouchListener() {

            public boolean onTouch(View v, MotionEvent event) {
                if (gestureDetector.onTouchEvent(event)) {
                    return true;
                }
                return false;
            }
        });

仅检测滑动(此处无法获取行位置)。

在 getview 中类似:

public View getView(int position, View convertView, ViewGroup parent) {
//other stuff

convertview.setOnTouchListener(same as above);

} 

无法检测到滑动。

有什么解决办法吗??? 我只想要滑动的行位置。

【问题讨论】:

标签: android listview gesture-recognition swipe-gesture


【解决方案1】:
private int position = -1;
@Override
protected void onListItemClick(ListView l, View v, int index, long id) {
position = index;
}

像这样?

【讨论】:

    【解决方案2】:

    要获取视图的行位置,请通过此函数获取 onTouch 为您的列表视图传递的视图位置

    wholelistview.setOnTouchListener(new View.OnTouchListener() {         
     public boolean onTouch(View v, MotionEvent event) {                 
     if (gestureDetector.onTouchEvent(event)) {
        int position =  indexOfChild(View v);
    
         return true;                 
         }                 
         return false;             
                      }         }); 
    

    它返回孩子的索引。 http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.5_r1/android/view/ViewGroup.java#ViewGroup.indexOfChild%28android.view.View%29

    【讨论】:

    • 你能解释一下吗,因为我不能使用 indexofchild 它说:这一行有多个标记 - 视图无法解析为变量 - 标记“v”上的语法错误,删除这个
    • 我没试过,现在不能试试这个...我会尝试告诉你一次@home
    【解决方案3】:

    你可以做 getTag 和 setTag 来知道视图的标签,并使用它你可以决定哪一行被刷了

    public View getView(int position, View convertView, ViewGroup parent) { 
    //other stuff 
         convertview.setTag(position);
    }  
    

    对于 swipe 来自链接

     public boolean onTouch(View v, MotionEvent event) {
         int pos = (Integer)v.getTag();
         Log.i(TAG,pos+" is swiped");
     }
    

    我没有实现这个..所以你必须测试错误..但据我所知,这可能是实现你想要做的好方法。

    【讨论】:

      【解决方案4】:

      hanry 你得到什么样的错误?我已经实现了它并且它工作得很好。但是,我没有存储元素的位置,而是存储了视图持有者,其中包括其他也具有模型属性的视图持有者。请记住,您必须检查 convertview 是否不为空。看一下代码:

      public View getView(int position, View convertView, ViewGroup parent) {
          View view = null;
      
          Model m = filter.subItems.get(position);
          if(m != null)
          {
              if (convertView == null) {
                  LayoutInflater inflator = context.getLayoutInflater();
                  view = inflator.inflate(R.layout.rowlayout, null);
                  ViewHolder viewHolder = new ViewHolder();
                  viewHolder.position = position; - here you can put your position.
                  view.setOnTouchListener(this.listener);
                  //assign whatever you like to the viewHolder - in most cases the model and inlated controls and then assign 
              } else {
                  view = convertView;
              }
              view.setTag(viewHolder);
          }
      

      然后

      public boolean onTouch(View v, MotionEvent event) {
          ViewHolder viewHolder = ((ViewHolder) v.getTag());
      }
      

      跳,有帮助。 ps:如果您对视图持有者和标签一无所知,我建议您查看there。弗兰肯斯坦提供的链接中已经描述了我的方法。

      【讨论】:

      • 我应该在其上实现 ontouchlistener full listview 或 convertview??因为我无法检测到触摸/滑动
      • 我正在附加到适配器中的视图。 view.setOnTouchListener(this.listener);只有在 converview 为空时,我才会这样做,在膨胀新视图之后。
      • +1 我在触摸时获取行位置,但未调用 (gestureDetector.onTouchEvent(event))
      • 我的手势检测器也有一些问题,这就是我停止使用它的原因。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      相关资源
      最近更新 更多