srbyk1990
srbyk1990

Reputation: 411

How to prevent a double-tap on a ListView?

Is there anyway to prevent double tap on ListView in Android? I found this when i accidentally tapped item on ListView and it opened up two new window. is there any way to prevent it from opening a same window twice.

Upvotes: 8

Views: 5032

Answers (7)

Michael Robinson
Michael Robinson

Reputation: 81

This solution is implemented on a ListFragment. If the tap dismissed the ListFragment to show a detail view (which it normally would), the next time the ListFragment appears, the tap counter is reset in OnResume():

public class MyListFragment extends ListFragment {

    int mTapCounter;

    @Override
    public void onResume() {
        super.onResume();

        //Set-Reset ListView clickListener
        mTapCounter = 0;
    }

    //ListView item tap event handler
    @Override
    public void onListItemClick(@NonNull ListView l, @NonNull View v, int position, long id) {

        //Disable click listener to prevent double-tap
        mTapCounter++;

        //Only process single-tap
        if(mTapCounter == 1) {

            /* YOUR TAP HANDLER CODE HERE */
        }

        super.onListItemClick(l, v, position, id);
    }
}

Upvotes: 0

CaptainCrunch
CaptainCrunch

Reputation: 1403

I have a two pane layout, a listview that controls a detail view. First I thought a delayed handler is the worst idea, but after testing it is the simplest. Otherwise I would have to communicate between activity and fragment to enable the listview item once another detail was loaded. Error prone and complex.

/*example with Handler():*/

        final boolean[] allowClick = {true};

        myview.setOnClickListener(v -> {

            //exit if not allowed
            if(!allowClick[0])
                return;

            //do stuff

            //we clicked, block another click
            allowClick[0] =false;

            //wait 0.7 seconds and allow another click
            new Handler().postDelayed(() -> allowClick[0] =true, 700);

        });

Upvotes: 0

Prawesh kafle
Prawesh kafle

Reputation: 3

In your XAML view page place isEnable property as a bindable and two way mode.

<ListView ItemsSource="{Binding items}"
                                  x:Name="listview"
                                  HasUnevenRows="True"
                                  IsEnabled="{Binding IsEnable, Mode=TwoWay}"
                                  RowHeight="10"
                                  SelectionMode="Single"
                                  VerticalScrollBarVisibility="Never">

In viewmodel of your xaml page :

    private bool _isEnable = true;
    public bool IsEnable
    {
        get => _isEnable;
        set
        {
            _isEnable = value; OnPropertyChanged(nameof(IsEnable));
        }
    }


public ICommand TapCommand => new Command<//Model>(async (obj) =>
    {
        IsEnable = false;
       //your stuff 
        IsEnable = true;
    });

Upvotes: 0

Er Ritesh singh
Er Ritesh singh

Reputation: 105

If you are using just single item like TextView in list then just create a class implements OnItemClickListener in this call and then in to onItemClick() method initialize myListView.setOnItemClickListenet(null); then use Handler.postDelayed method to again set onItemClickListener. like

myListView.setOnItemClickListener(new MyClickListenerClass());

This is working for all time in my case.

Upvotes: 0

Abhisekh Tripathy
Abhisekh Tripathy

Reputation: 37

Just add listView.setEnabled(false); on select of listview and after select when response will come or back button press just write---- listView.setEnabled(true);

Upvotes: 2

Jitesh Upadhyay
Jitesh Upadhyay

Reputation: 5260

Have a try with introducing and Override of isEnabled method

    @Override
public boolean isEnabled(int position) {
    return false;
}

for the listview.

introduce a boolean for flag and an int to maintain last clicked position

 int recentlyClickedPoisition;
        boolean flagRecentClickedPoisition;

override the isEnabled method as follows

   @Override
   public boolean isEnabled(int position) {
        if (flagRecentClickedPoisition && recentlyClickedPoisition == position) {
            return false;
        } else {
            return true;
        }
    }

than set the last clicked position from your click listener as follows

public void setLastClickedPoisition(int recentlyClickedPoisition) {
    flagRecentClickedPoisition = true;
    this.recentlyClickedPoisition = recentlyClickedPoisition;
}

Hope this will work for you to prevent from double tap, enhance accordinly.

Upvotes: 0

Viral Patel
Viral Patel

Reputation: 33408

You should restrict the target activity (one that opens when an item is clicked) to have only one instance at any point of time.

Answer to this SO question should help you in achieving that. That way if you accidentally double click, you will still see just one new screen.

Upvotes: 0

Related Questions