onTouchListener в адаптере ListView делает onItemClickListener не запущенным

Я создаю собственный адаптер для своего представления списка. В методе getView я установил onTouchListener для LinearLayout в своем пользовательском адаптере. По какой-то причине onItemClickListener в моем списке не может работать из-за этого. Это мой код для моего пользовательского метода адаптера TransactionAdapter:

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

}

А это мои setAdapter и onItemClickListener для ListView:

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

person Kuro13    schedule 20.12.2014    source источник
comment
Итак, давайте переосмыслим вашу логику. Вы устанавливаете onTouchListener в свой LinearLayout, и я полагаю, что над ним у вас есть список. и вам интересно, почему не работает onItemClickListener?? ну, я считаю, что это потому, что вы устанавливаете onTouchListener для корневого элемента (LinearLayout), и это влияет на список.   -  person Kostas Drak    schedule 20.12.2014
comment
извините, что не предоставил полный код, мой линейный макет - это настраиваемый макет адаптера, а не макет, в котором находится мой список.   -  person Kuro13    schedule 20.12.2014
comment
так почему бы вам не использовать touchlistener в списке, чтобы изменить фон вашего линейного макета?   -  person Kostas Drak    schedule 20.12.2014
comment
я не могу получить позицию затронутого элемента из onTouchListener в ListView..   -  person Kuro13    schedule 20.12.2014


Ответы (1)


вы должны вернуть false, чтобы распространить событие касания, чтобы прослушиватель кликов мог зафиксировать событие клика, поэтому:

   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;
        }
    });
person mmlooloo    schedule 20.12.2014