BaseAdapter OnItemClickListener никогда не вызывается

У меня есть обычай BaseAdapter для меня ListView в котором я реализую AdapterView.OnItemClickListener,

Проблема заключается в onItemClick(AdapterView<?>, View, int, long) метод никогда не вызывается. Я думаю, мне нужно реализовать это interface в моей главной Activity а не по моему ListView пользовательский адаптер.

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

Я прав?

2 ответа

Решение

Зачем вам иметь OnItemClickListener внутри адаптера?! Либо у вас есть OnClickListener внутри адаптера, либо рекомендуется установить OnItemClickListener в ListView или любой другой AdapterView, который вы используете в своей деятельности / фрагменте. То, как вы делаете это прямо сейчас, не сработает по нескольким причинам:

  1. Вы не настраиваете слушателя на представление.
  2. Вы НЕ МОЖЕТЕ установить OnItemClickListener для TextView.
  3. Установка onClickListener для TextView внутри класса адаптера означает, что вам придется щелкнуть сам TextView, иначе слушатель НЕ будет вызван.

С пользовательским адаптером OnItemClickListener не работает. Вы должны зарегистрировать onClickListener для просмотра в методе getView.

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;
    }
Другие вопросы по тегам