0

是否可以在 Android 上的 ListView 或 GridView 中设置一些不可点击的项目?
例如,如果用户单击项目 0,我想设置项目 1 不能被单击。
但是如果在 onItemClick 方法中处理,它仍然可以点击和改变颜色。
我希望它不能被点击意味着项目点击但什么也不做。
我的代码如下:

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

我该如何设置?

4

2 回答 2

2

您想要实现的目标存在一个问题。如果 - 例如 - 您要禁用的项目当前不可见,ListView因为用户的屏幕较小且不适合 的大小ListView,则该项目尚未View分配任何内容。这意味着您不能真正使该项目不可点击,因为它不存在。

Avadhani Y 发布的解决方案是错误的,因为它使您刚刚单击的项目不可点击并且您想要更改另一个项目。

那么你想要的是创建你自己AdapterListView(如果你还没有使用你的 custom Adapter)和覆盖getView()方法,如下所示:

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

你的OnItemClickListenerforListView应该是这样的:

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

我没有测试它或任何东西,所以你可能需要修复一些错误。

于 2013-06-27T07:24:04.427 回答
1

是的,你可以这样做:

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);
    }
}
});
于 2013-06-27T06:57:13.667 回答