I have a ListView with a hypothetical SquirrelAdapter. Something like this:
public class SquirrelAdapter extends ArrayAdapter<Squirrel> {
private LayoutInflater layoutInflater;
private Context context;
private int resource;
public SquirrelAdapter (Context context, int resource, List<Squirrel> squirrels) {
super(context, resource, squirrels);
layoutInflater = LayoutInflater.from(context);
this.context = context;
this.resource = resource;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Squirrel squirrel = getItem( position );
convertView = layoutInflater.inflate(resource, null);
TextView squirrelNicknameTextView = (TextView) convertView.findViewById(R.id.squirrelNickname);
squirrelNicknameTextView.setText( squirrel.getCuteNickname() );
return convertView;
}
}
So in an activity I can do this:
Squirrel[] squirrels = // Lot of Squirrels
SquirrelAdapter squirrelAdapter = new SquirrelAdapter(
getApplicationContext(),
R.layout.squirrel_layout,
Arrays.asList( squirrels )
);
squirrelListView.setAdapter( squirrelAdapter );
And so I can append an onItemClickListener:
squirrelListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// Bad people cast a squirrel :|
Squirrel squirrel = (Squirrel) parent.getItemAtPosition(position);
Log.i("WWF", "Tapped squirrel " + squirrel.getCuteNickname());
}
});
It works really well. But now the really boring question:
How can I use Java's parameterized type in AdapterView<T extends Adapter>.setOnItemClickListener? I'm thinking something like below, but it gives errors:
squirrelListView.setOnItemClickListener(new AdapterView<SquirrelAdapter>.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<SquirrelAdapter> parent, View view, int position, long id) {
// Squirrels approved!
Squirrel squirrel = parent.getItemAtPosition(position);
Log.i("WWF", "Tapped squirrel " + squirrel.getCuteNickname());
}
});
Why can't I have syntax such as "
AdapterView<ArrayAdapter<T>>.OnItemClickListener"?Why doesn't something like this exist:
<T> getItemPosition(int position)? Can it be implemented?
Thanks helping my squirrels not to be casted.
(More seriously I want to learn more about this Java feature...)
As you might have seen if you try
new AdapterView<SquirrelAdapter>.OnItemClickListener()compiler would say,What you are doing inside
listView.setOnItemClickListeneris to create anAnonymousclass, for aninterface OnItemClickListenerinsideabstract class AdapterView. Now, to get reference ofinterfaceinside anabstractclass, you need to access only statically, such asAdapterView.OnItemClickListener, and hence the compiler error as above.Even if you try to create a concrete class that
implementsOnItemClickListeneryou have to access statically only, such asclass MyImpl implements MyAbstract.MyInterfaceIf you have noticed signature of
AdapterViewclassthat indicates,
AdapterViewcan haveAdapteror any subtype of it as its parameter. But to get hold of elements(data)Adapteris connected to,AdapterViewusesAs you could see inside:
Casting of your
SquirrelinsideonItemClickis needed. See if it helps!