2014-10-08 71 views
0

我想在android listview項目中實現ontouch和onclicklistener。Android和列表項onclick

如果我選擇行並單擊一行,需要調用onclicklistener。

同時如果我有左右滑動列表行,需要在適配器文件中調用ontouchlistener。

我該怎麼辦?請給我一個這樣的解決方案?

這裏刷卡工作fine.but 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); 
       }}); 
+0

你想上的所有觀點,即代表名單或該行的某些特殊項目的行執行的onClick? – Eddy 2014-10-08 10:54:06

+0

我需要在列表的選定行上執行onclick()函數。 – 2014-10-08 10:55:32

+0

在您的列表視圖項目中使用手勢監聽器,它將同時提供觸摸以及點擊監聽器。 – Meenal 2014-10-08 11:34:22

回答

0

要在ListView中的行,你應該使用onItemClickListener藉此在的onClick,通過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(); 
+0

我已經嘗試過使用您的logic.it,這意味着我已經刷過該行,onclick功能僅在當時ontouch功能不working.ok我會去另一種方式GestureDetector.SimpleOnGestureListener – 2014-10-08 11:16:42

+0

我現在有點忙,不能測試代碼,並說100%它會不會起作用,但至少有一個給了你一個起點。希望它會有所幫助。如果我會找到一些時間,我會測試併發布結果。 – Eddy 2014-10-08 11:26:07

0

簡單的解決方案:在您"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叫。什麼將訣竅是返回falseonTouch

this答案