【问题标题】:BaseAdapter OnItemClickListener never calledBaseAdapter OnItemClickListener 从未调用过
【发布时间】:2016-08-17 07:08:56
【问题描述】:

我有一个自定义的BaseAdapter 用于我的ListView,我在其中实现了AdapterView.OnItemClickListener

问题是永远不会调用onItemClick(AdapterView<?>, View, int, long) 方法。我想我需要在我的主要 Activity 而不是我的 ListView 自定义适配器中实现 interface

MyListViewAdapter.java

public class MyListViewAdapter extends BaseAdapter implements AdapterView.OnItemClickListener
{
    private Context context;
    private ArrayList<MyListViewRow> rowsList = new ArrayList<MyListViewRow>(); // All one row items

    private TextView a;


    public MyListViewAdapter(Context context,ArrayList<MyListViewRow> rowsList)
    {
        this.context = context;
        this.rowsList = rowsList;
    }

    @Override
    public int getCount()
    {
        return this.rowsList.size();
    }

    @Override
    public Object getItem(int position)
    {
        return this.rowsList.get(position);
    }

    @Override
    public long getItemId(int position)
    {
        return position;
    }

    /**
     * Returns a new row to display in the list view.
     *
     * Position - position of the current row.
     *
     */
    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        LayoutInflater layoutInflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        /**
         * Inflating the root view and all his children and set them to a View Object.
         *
         */
        View row = layoutInflater.inflate(R.layout.list_view_row,null);

        // Get all the views in my row
        this.a = (TextView) row.findViewById(R.id.a_id;


        MyListViewRow myListViewRow = rowsList.get(position);

        // Set values to all the views in my row
        this.a.setText(myListViewRow.getA());



        return row;
    }


    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id)
    {
        Toast.makeText(context, "onItemClick LV Adapter called", Toast.LENGTH_LONG).show();

    }


} // End of MyListViewAdapter class

我说的对吗?

【问题讨论】:

  • 你有没有在任何地方调用 listView.setOnItemClickListener ?没有它就不会被调用。
  • @GabeSechan 否,因为我在 BaseAdapter 类中实现了 interface
  • 这并不意味着什么。你必须调用 setOnItemClickListener 否则它永远不会被调用。
  • onItemClick 侦听器不需要。您可以在 baseadapter 中使用 onclick 侦听器,也可以在您的活动/片段中为您的列表视图设置 onItemclick 侦听器
  • @RanjithKumar 我应该为myListView.setOnItemClickListener 传递什么 ass 参数? @USKMobility 说我不能将 OnItemClickListener 与自定义适配器一起使用。那么你们谁是对的呢?

标签: java android listview baseadapter onitemclicklistener


【解决方案1】:

为什么要在适配器内部有一个 OnItemClickListener?!要么您在 Adapter 中有 OnClickListener,要么最佳做法是将 OnItemClickListener 设置为 ListView 或您在活动/片段中使用的任何 AdapterView。 你现在做的方式,它不会工作有几个原因:

  1. 您没有将侦听器设置为视图。
  2. 不能将 OnItemClickListener 设置为 TextView。
  3. 将 onClickListener 设置为适配器类中的 TextView,意味着您必须单击 TextView 本身,否则,侦听器不会被调用。

【讨论】:

  • 如果我不能将OnItemClickListener 设置为TextView,那么我将简单地使用OnClickListener。我说的对吗?
  • 是的,但我建议您在 ListView 上使用 OnItemClickListener。类似于: ListView mListView = (ListView) findViewById(R.id.myListView); mListView.setOnItemClickListener(new AdapterView.OnItemClickListener(){ @Override public void onItemClick(AdapterView> parent, View view, int position, long // 在这里实现你需要做的任何事情} };
  • 像什么?如果它不适用于TextView,那对我来说毫无价值。
  • 如果您出于任何原因必须将 onClick 事件设置为 TextView,那么您应该在 TextView 上使用 OnClickListener
【解决方案2】:

使用自定义适配器 OnItemClickListener 不起作用。您必须在 getView 方法中注册 onClickListener。

public View getView(int position, View convertView, ViewGroup parent)
    {
        LayoutInflater layoutInflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        /**
         * Inflating the root view and all his children and set them to a View Object.
         *
         */
        View row = layoutInflater.inflate(R.layout.list_view_row,null);

        // Get all the views in my row
        this.a = (TextView) row.findViewById(R.id.a_id;


        MyListViewRow myListViewRow = rowsList.get(position);

        // Set values to all the views in my row
        this.a.setText(myListViewRow.getA());
        row.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // do your stuff
        }
    });


        return row;
    }

【讨论】:

  • 为什么它不适用于自定义适配器?我在文档中没有看到任何关于它的注释。
  • 是的,它没有在 android 文档中提及。发生点击事件冲突。所以 OnIemClickListener 不起作用。您可以尝试在行的所有子视图中禁用 android:focusableInTouchMode="false" android:clickable="false" android:focusable="false"
猜你喜欢
  • 1970-01-01
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多