brian
brian

Reputation: 6922

Is it possile to set some item unclickable in ListView or GridView on Android?

Is it possile to set some item unclickable in ListView or GridView on Android?
For example, if user click item 0, I want to set item 1 cannot be click.
But if handle in onItemClick method, it still can click and change color.
I want it cannot be click means item click but do nothing.
My code as below:

GridView gv = (GridView)findViewById(R.id.gv);
gv.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
        if(position == 0) {
            //set item 1 unclickable
        }
    }
});
ListView lv = (ListView)findViewById(R.id.lv);
lv.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
        if(position == 0) {
            //set item 1 unclickable
        }
    }
});

How can I set it?

Upvotes: 0

Views: 2992

Answers (2)

Piotr Chojnacki
Piotr Chojnacki

Reputation: 6867

There is one problem with what you want to achieve. If - for example - the item that you want to disable is not currently visible in ListView because user have smaller screen and it doesn't fit the size of ListView, this item doesn't yet have any View assigned to it. This means that you can't really make this item not clickable, because it doesn't exist.

Solution which Avadhani Y posted is wrong, because it makes the item that you just clicked not clickable and you want to alter another item.

What you want then is to create your own Adapter for ListView (if you don't yet use your custom Adapter) and override getView() method, like this:

public class MyAdapter extends ArrayAdapter<String> {
    private List<String> items;
    public boolean itemAtPos0Clicked = false;

    public MyAdapter(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
    }

    public MyAdapter(Context context, int resource, List<String> items) {
        super(context, resource, items);
        this.items = items;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(position == 1 && itemAtPos0Clicked) {
            convertView.setClickable(false);
        }

        return convertView;
    }
}

And your OnItemClickListener for ListView should look like this:

final ListView lv = (ListView)findViewById(R.id.listView1);
lv.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
        if((position == 0) && (lv.getFirstVisiblePosition() == 0)) {
            ((MyAdapter)lv.getAdapter()).itemAtPos0Clicked = true;
            ((MyAdapter)lv.getAdapter()).notifyDataSetChanged();
        }
    }
});

I didn't test it or anything, so you will probably have to fix few errors.

Upvotes: 2

Avadhani Y
Avadhani Y

Reputation: 7636

Yes, you can do that as below:

ListView lv = (ListView)findViewById(R.id.lv);
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
    if(position == 0) {
        arg1.findViewById(R.id.lv).setClickable(false);
    }
}
});

Upvotes: 1

Related Questions