【问题标题】:Extending AdapterView扩展适配器视图
【发布时间】:2011-02-03 13:38:03
【问题描述】:

我正在尝试(出于学习目的)自己实现一个简单的 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 中有用于这些点击、长按等事件的代码……那我为什么不能直接触发它们呢? 也许我误解了 AdapterView 如何工作的基本内容?我应该扩展其他基类吗?为什么?

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

【问题讨论】:

  • 你有解决办法吗??

标签: android android-adapterview


【解决方案1】:

如果您查看AdapterView 的源代码,您会看到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 源中搜索使用此方法的位置,您会发现它没有在任何地方调用!

确实,例如,如果您检查 Gallery 的来源,您会看到在处理 onSingleTapUponKeyUp 事件时调用了 performItemClick

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

【讨论】:

    【解决方案2】:

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

    getView(int position, View convertView,ViewGroup group) 
    

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

    【讨论】:

    • 我知道为适配器上的每个视图放置我自己的 onClick 侦听器,但可以接受吗?我也可以在我的类中在“addViewInLayout”之后为每个孩子添加onClickListeners......但我认为适配器应该只管理“项目”,而视图(AdapterView)应该管理位置,事件等等...... ListView/GridView 是否相同...它们的层次结构来自 AdapterView->AbsListView->ListView,所以我想我可以做类似的事情但它不起作用...
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-03
      • 1970-01-01
      相关资源
      最近更新 更多