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, который вы используете в своей деятельности / фрагменте. То, как вы делаете это прямо сейчас, не сработает по нескольким причинам:
- Вы не настраиваете слушателя на представление.
- Вы НЕ МОЖЕТЕ установить OnItemClickListener для TextView.
- Установка 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;
}