BaseAdapter OnItemClickListener 从未调用过

BaseAdapter OnItemClickListener never called

我为我的 ListView 定制了一个 BaseAdapter,我在其中实现了 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

我说得对吗?

自定义适配器 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;
    }

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

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