14

我正在尝试(出于学习目的)自己实现一个简单的 AdapterView,其中项目来自基本适配器(来自 sdk 示例的 ImageAdapter)。

实际代码是这样的:

    public class MyAdapterView extends AdapterView<ImageAdapter> implements AdapterView.OnItemClickListener{
    private ImageAdapter mAdapter;
    public MyAdapterView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initThings();
    }
    private void initThings(){
        setOnItemClickListener(this);
    }
    @Override
    public ImageAdapter getAdapter() {
        // TODO Auto-generated method stub
        return mAdapter;
    }
    @Override
    public void setAdapter(ImageAdapter adapter) {
        // TODO Auto-generated method stub
        mAdapter=adapter;
        requestLayout();
    }
    View obtainView(int position) {
        View child = mAdapter.getView(position, null, this);
        return child;
    }
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
     super.onLayout(changed, l, t, r, b);
        for(int i=0;i<mAdapter.getCount();i++){
            View child = obtainView(i);
            child.layout(10, 70*i, 70, 70);
            addViewInLayout(child, i, null, true);
        }
        this.invalidate();
    }
    @Override
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
        Log.d("MYEXAMPLES","Clicked an item!");
    }
}

这不是一个编码杰作,它只是显示一个带有图片的伪列表视图。我知道我本可以使用 ListView、GridView、Spinner 等,但我对 android 还比较陌生,我正试图弄清楚它上面的一些东西。

好吧,这里的问题是:为什么我的onItemClick没有触发?

将相同的 ImageAdapter 与 GridView 一起使用,一切正常,但是当我与上述类一起使用时,我什么也得不到。在AdapterView.java中,有用于这些 click、longclick 等事件的代码……那我为什么不能直接触发它们呢?也许我误解了 AdapterView 如何工作的基本内容?我应该扩展其他基类吗?为什么?

希望在这里找到更多经验丰富的指导,在此先感谢。

4

3 回答 3

3

如果您查看AdapterView's 的源代码,您会看到OnItemClickListener在一个名为 的方法中调用了performItemClick

public boolean performItemClick(View view, int position, long id) {
    if (mOnItemClickListener != null) {
        // ...
        mOnItemClickListener.onItemClick(this, view, position, id);
        return true;
    }
    return false;
}

但是,如果您搜索AdapterView使用此方法的源代码,您会发现它没有在任何地方调用!

实际上,如果您检查Galleryexample 的来源,您会看到在处理or事件performItemClick时调用了 the 。onSingleTapUponKeyUp

如果你想使用它,你必须检测用户何时点击某处并performItemClick自行调用。

于 2013-04-10T14:53:43.997 回答
0

与其扩展 AdapterView,不如尝试使用 baseAdapter。当你定制你的适配器时,它有下面给出的方法。

getView(int position, View convertView,ViewGroup group) 

在上面的方法中,您可以访问列表视图的每个列表项的布局,在这里您可以为每个控件设置所有支持的事件。

于 2010-04-02T07:38:27.993 回答
0

我正在玩类似的东西,我正在使用 onItem* Selected *Listener 这可能是您正在寻找的更多内容。

于 2012-07-25T10:53:18.853 回答