【问题标题】:Ontouch and onclick in android list itemandroid列表项中的ontouch和onclick
【发布时间】:2014-10-08 10:46:14
【问题描述】:

我想在android listview item中实现ontouch和onclicklistener。

如果我选择了行并单击了一行,则需要调用 onclicklistener。

同时如果我左右滑动列表行,需要在适配器文件中调用ontouchlistener。

我该怎么办?请给我一个解决方案?

这里滑动工作正常。但是 onclick 没有从我的代码中调用。

在活动文件中,

class MyUpcomingTouchListener implements OnTouchListener
{
    @Override
    public boolean onTouch(View v, MotionEvent event) {

        ViewHolder1 holder = (ViewHolder1) v.getTag(R.layout.listof_upcoming);
        int action = event.getAction();
        int position = (Integer) v.getTag();

        switch (action) {
        case MotionEvent.ACTION_DOWN:
            action_down_x = (int) event.getX();
            Log.d("action", "ACTION_DOWN - ");
            break;
        case MotionEvent.ACTION_MOVE:
            Log.d("action", "ACTION_MOVE - ");
            action_up_x = (int) event.getX();
            difference = action_down_x - action_up_x;
            break;
        case MotionEvent.ACTION_UP:
            Log.d("action", "ACTION_UP - ");
            calcuateupcomingDifference(holder, position);
            action_down_x = 0;
            action_up_x = 0;
            difference = 0;
            break;
        }
        return true;

    }

}
private void calcuateupcomingDifference(final ViewHolder1 holder, final int position) {
    runOnUiThread(new Runnable() {

        @Override
        public void run() {
            if (difference == 0) {
            }
            if (difference > 90) {
                holder.carudetails.setVisibility(View.GONE);
                holder.carucheckin.setVisibility(View.VISIBLE);
                holder.caruimage.setVisibility(View.VISIBLE);
                upcomingitems.get(position).setVisible(true);
                upcominglistAdapter.changeData(upcomingitems);
            }
            if (difference < -90) {
                holder.carudetails.setVisibility(View.VISIBLE);
                holder.carucheckin.setVisibility(View.GONE);
                holder.caruimage.setVisibility(View.GONE);
                upcomingitems.get(position).setVisible(true);
                upcominglistAdapter.changeData(upcomingitems);
            }
        }
    });
}

从适配器文件,

 convertView.setOnTouchListener(mOnTouchListener);
 convertView.setOnClickListener(new  View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(TodayList.this,
                            DetailPage.class);
                startActivity(intent);
               }});

【问题讨论】:

  • 你是要对代表List行的所有View执行onClick,还是对行的某个特殊项执行onClick?
  • 我需要在列表的选定行上执行 onclick() 功能。
  • 在列表视图项上使用手势监听器,它将同时提供触摸和点击监听器..

标签: android android-listview swipe baseadapter ontouchlistener


【解决方案1】:

要在 ListView 的一行上执行 onClick,您应该使用 onItemClickListener,通过 list.setOnItemClickListener() 设置它。如果你想从适配器提供这个,那么最好使用 GestureDetector.SimpleOnGestureListener,你有像滚动,双击,单击之类的事件。 另外,如果您想从现有代码中执行 onClick,您可以尝试:

private void calcuateupcomingDifference(final ViewHolder1 holder, final int position) {
runOnUiThread(new Runnable() {

    @Override 
    public void run() { 
         int absValue=Math.abs(difference);
        if (absValue >= 0 && absValue<=10) {
           holder.rowLayout.performOnClick(); 
        } 
        if (difference > 90) { 
            holder.carudetails.setVisibility(View.GONE);
            holder.carucheckin.setVisibility(View.VISIBLE);
            holder.caruimage.setVisibility(View.VISIBLE);
            upcomingitems.get(position).setVisible(true);
            upcominglistAdapter.changeData(upcomingitems); 
        } 
        if (difference < -90) { 
            holder.carudetails.setVisibility(View.VISIBLE);
            holder.carucheckin.setVisibility(View.GONE);
            holder.caruimage.setVisibility(View.GONE);
            upcomingitems.get(position).setVisible(true);
            upcominglistAdapter.changeData(upcomingitems); 
        } 
    } 
});
// DO not forget to add the rowLayout of converView to ViewHolder1 and to set rowLayout.setOnClickListener(); 

【讨论】:

  • 我已经尝试过你的逻辑。这意味着我已经滑动了行。,onclick 功能仅在当时有效 ontouch 功能不起作用。好的,我将采用另一种方式 GestureDetector.SimpleOnGestureListener跨度>
  • 我现在有点忙,无法测试代码并说 100% 是否有效,但至少给了你一个起点。希望它会有所帮助。如果我能找到一些时间,我会测试并发布结果。
【解决方案2】:

简单的解决方案:

在您的活动文件中的"ACTION_DOWN" 上返回false,如下所示:

class MyUpcomingTouchListener implements OnTouchListener
{
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        ...
        switch (action) {
        case MotionEvent.ACTION_DOWN:
            ...
            return false;
        case MotionEvent.ACTION_MOVE:
            ...
            break;
        case MotionEvent.ACTION_UP:
            ...
            break;
        }
        return true;
    }
}

解释:

onTouch 总是在按下视图时被调用,因为这是将事件分派到视图的初始状态。当你长 按你的观点,这仍然首先调用onTouch,因为你 之前在onTouch 中返回了true(这意味着你已经消费了 这个事件,它不应该被进一步发送)你不会得到onLongPress 的调用。解决办法是在onTouch 中返回false

感谢this 回答

【讨论】:

    猜你喜欢
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多