2014-12-20 1 views
1

내 목록보기에 대한 사용자 지정 어댑터를 만듭니다. getView 메서드에서 사용자 지정 어댑터에 LinearLayout에 대해 onTouchListener을 설정했습니다. 웬일인지, 나의리스트 뷰의 onItemClickListener는 이것 때문에 달릴 수 없다. 이 내 코드는 내 사용자 지정 어댑터 TransactionAdapter 방법 :어댑터 ListView의 onTouchListener가 실행되지 않는 onItemClickListener 만들기

public class TransactionAdapter extends BaseAdapter { 
    private LayoutInflater inflater; 
    private ArrayList<CTransaction> transactions; 

    public TransactionAdapter(Context context, ArrayList<CTransaction> transactions){ 
     inflater = LayoutInflater.from(context); 
     this.transactions = transactions; 
    } 

    @Override 
    public int getCount() { 
     return transactions.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return transactions.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     final View view = convertView = inflater.inflate(R.layout.detail_transaction, parent, false); 

     LinearLayout llBackground = (LinearLayout)convertView.findViewById(R.id.llBackground); 

     llBackground.setOnTouchListener(new View.OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        v.setBackground(view.getResources().getDrawable(R.drawable.border_clicked)); 
        break; 
       case MotionEvent.ACTION_UP: 
        v.setBackground(view.getResources().getDrawable(R.drawable.border)); 
        v.performClick(); 
        break; 
       case MotionEvent.ACTION_CANCEL: 
        v.setBackground(view.getResources().getDrawable(R.drawable.border)); 
        break; 
       } 

       //Tried to use this but not working 
       view.onTouchEvent(event); 

       return true; 
      } 
     }); 

     return convertView; 
    } 

} 

그리고 이것은 ListView에 대한 내 setAdapteronItemClickListener입니다 : 당신이 터치 이벤트를 전파 false를 반환해야한다

lvTransaction = (ListView)findViewById(R.id.lvTransaction); 
    TransactionAdapter adapter = new TransactionAdapter(this, transactions); 
    lvTransaction.setAdapter(adapter); 
    lvTransaction.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 
      final int positionSelected = position; 

      AlertDialog.Builder ad = new AlertDialog.Builder(HistoryActivity.this); 
      //Show the AlertDialog 
     } 
    }); 
+0

그럼 논리를 다시 생각해 봅시다. onTouchListener를 LinearLayout으로 설정하면 목록 뷰가 있다고 생각합니다. 왜 onItemClickListener가 작동하지 않는지 궁금합니다. 나는 당신이 (LinearLayout) 루트 요소에 onTouchListener를 설정하고 listview에 영향을 미치기 때문에 그것을 믿는다. –

+0

전체 코드를 제공하지 않아서 죄송합니다. 선형 레이아웃은 맞춤 어댑터 레이아웃이며 내 목록보기가있는 레이아웃이 아닙니다. – Kuro13

+0

그래서 왜 선형 레이아웃 배경을 변경하려면 listview에 touchlistener를 사용하지 않습니까? –

답변

2

클릭 리스너 수 있도록 클릭 이벤트를 캡처하십시오 :

llBackground.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       v.setBackground(view.getResources().getDrawable(R.drawable.border_clicked)); 
       break; 
      case MotionEvent.ACTION_UP: 
       v.setBackground(view.getResources().getDrawable(R.drawable.border)); 
       v.performClick(); 
       break; 
      case MotionEvent.ACTION_CANCEL: 
       v.setBackground(view.getResources().getDrawable(R.drawable.border)); 
       break; 
      } 
      return false; 
     } 
    }); 
관련 문제