user5524159
user5524159

Reputation: 553

When on touch listener activated on item click not working

I have an activity which implements OnItemClickListener, OnItemLongClickListener and displays a listview. I have added an OnTouchListener in my list adapter class so that user can swipe on the listview item. But when I run my app the swipe on the list view item works but onItemClick and onItemLongClick no longer work. But if I remove OnTouchListener from my adapter the itemclick and itemlongclick works.

Here's my code

myactivity

public class InterActivity extends Activity implements 
OnItemClickListener, OnItemLongClickListener
{

    ListView listview;
    List<ParseObject> ob;
    AlertDialog dialog;
    ProgressDialog mProgressDialog;
    FinalAdapter adapter;
    TestAdapter tstapter;
     List<CodeList> codelist = null;
     SharedPreference shrdPreference;

     private int limit = 15;

     GestureDetectorCompat mDetector;
    View footerView;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.inter_layout);
        shrdPreference = new SharedPreference();

        //Execute RemoteDataTask AsyncTask

        new RemoteDataTask().execute();
    }

    private class RemoteDataTask extends AsyncTask<Void, Void, Void> {
        //my remote data task to perform async task//
    }

    @Override
    public void onItemClick(AdapterView<?> p1, View view, int position, long p4)
    {
        intent.putExtra("codetext",
                                    (codelist.get(position).getFinalCodeText()));
                    // Start SingleItemView Class
                     startActivity(intent);
    }

    @Override
    public boolean onItemLongClick(AdapterView<?> arg0, View view, int position, long arg3)
    {
        //my method to perform when item is long pressed
    }

    @Override
    protected void onResume()
    {
        super.onResume();
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        overridePendingTransition(R.anim.left_to_right, R.anim.right_to_left);
    }

}

getview() of my list adapter

@Override
public View getView(final int position, View view, ViewGroup parent)
{
    final ViewHolder holder;
    if(view == null){
        holder = new ViewHolder();
        view = inflater.inflate(R.layout.listitem,null);
        holder.contaainer = (RelativeLayout) view.findViewById(R.id.container);
        holder.listHeading = (TextView) view.findViewById(R.id.beg_list_itemTextView);

        holder.listHash = (TextView) view.findViewById(R.id.listview_hashtags);
        holder.alphabetList = (ImageView) view.findViewById(R.id.beg_list_itemImageView);

        holder.favariteImage = (ImageView) view.findViewById(R.id.favbtn);
        holder.mDetector = new GestureDetectorCompat(context, new MyGestureListener(context, view));
        view.setTag(holder);

    }else{
        holder = (ViewHolder) view.getTag();
    }
    CodeList codes = (CodeList) getItem(position);
    holder.listHeading.setText(codeList.get(position).getListHeading());
    holder.listHash.setText(codeList.get(position).getListHashText());
    imageLoader.DisplayImage(codeList.get(position).getAlphabetimg(),
                             holder.alphabetList);

    holder.contaainer.setOnTouchListener(new OnTouchListener(){

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                holder.mDetector.onTouchEvent(event);
                return true;
            }
    });

    return view;
}

Upvotes: 3

Views: 1569

Answers (1)

Floern
Floern

Reputation: 33904

When you set a custom OnTouchListener you are intercepting touch events and thus overriding the default touch handler that handles normal click events.

If you want to allow the default click events, you have to return false in your onTouch() implementation, to let the events pass through to the default handler.

holder.contaainer.setOnTouchListener(new OnTouchListener(){
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        holder.mDetector.onTouchEvent(event);
        return false;
    }
});

Upvotes: 2

Related Questions