在滑动ListView时获取行位置

5

我知道这种问题之前已经有人提出过(链接)。 我已经尝试了手势检测器:

 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);

} 

但是无法检测滑动。 有什么解决方案吗?我只想知道滑动发生的行位置。

1
https://dev59.com/y2855IYBdhLWcg3wYjOF 无论如何...祝你生日快乐! - MKJParekh
@Frankenstein 我已经看到了这个。但是我怎么能从中获取行位置呢? - Hanry
我不确定,但是使用这个http://software-workshop.eu/content/swiping-listview-elements,你可以向右滑动吗?在那里,你会得到View v作为参数,你不能在那里使用getTag来知道视图的标签,并在你的列表创建getView()方法中设置它吗?通过使用set和getTag(),你可能可以实现这一点。试试看。 - MKJParekh
4个回答

3

汉瑞,你遇到了哪些错误?我已经实现了它,并且它完美地工作。但是,我存储的不是元素的位置,而是视图持有者,其中还包括模型属性。记住要检查convertview是否为null。看一下代码:

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());
}

希望这能有所帮助。 附注:如果您对视图持有者和标签一无所知,建议查看此处。我的方法已在Frankenstein提供的链接中描述。

我应该在哪里实现ontouchlistener,是在full listview还是convertview?因为我无法检测到触摸/滑动。 - Hanry
我正在适配器中将视图附加到视图上。 view.setOnTouchListener(this.listener); 只有在converview为空时,我才会这样做,在充气新视图之后。 - MariuszP
+1 我在触摸时获取了行位置,但是 (gestureDetector.onTouchEvent(event)) 没有被调用。 - Hanry
我也遇到了一些手势检测器的问题,这就是为什么我停止使用它的原因。 - MariuszP

1

想要获取您的视图的行位置,可以使用以下函数通过onTouch获取您的listview中所传递的视图的位置:

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”上的语法错误,请删除
- Hanry
我还没有尝试过,现在也无法尝试... 我会回家后尝试并告诉你。 - om252345

1

你可以使用 getTag 和 setTag 方法来获取和设置视图的标签,通过这种方式你可以确定哪一行被滑动了。

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

并从链接中返回 刷卡

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

我没有实现这个..所以你需要测试错误..但是根据我的看法,这可能是实现你想做的事情的好方法。


0
private int position = -1;
@Override
protected void onListItemClick(ListView l, View v, int index, long id) {
position = index;
}

像这样吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接