Android的列表视图。 AdapterView.OnItemClickListener中的参数化类型

时间:2015-05-30 17:57:43

标签: java android android-listview parameterized-types

我有ListView假设SquirrelAdapter。像这样:

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;
    }
}

所以在activity我可以这样做:

Squirrel[] squirrels = // Lot of Squirrels

SquirrelAdapter squirrelAdapter = new SquirrelAdapter(
    getApplicationContext(),
    R.layout.squirrel_layout,
    Arrays.asList( squirrels )
);
squirrelListView.setAdapter( squirrelAdapter );

所以我可以添加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());
    }
});

效果很好。但现在真是无聊的问题:

如何在AdapterView<T extends Adapter>.setOnItemClickListener中使用Java的参数化类型?我在想下面的内容,但它会出错:

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());
    }
});
  

为什么我不能使用“AdapterView<ArrayAdapter<T>>.OnItemClickListener”之类的语法?

     

为什么不存在这样的事情:<T> getItemPosition(int position)?可以实施吗?

感谢帮助我的松鼠不被投入。

(更严重的是,我想更多地了解这个Java功能...)

1 个答案:

答案 0 :(得分:1)

正如您可能已经看到的那样,new AdapterView<SquirrelAdapter>.OnItemClickListener()编译器会说,

  

The member type AdapterView<SquirrelAdapter>.OnItemClickListener cannot be qualified with a parameterized type, since it is static.

您在listView.setOnItemClickListener内所做的是为Anonymous内的interface OnItemClickListener创建一个abstract class AdapterView课程。现在,要在interface类中引用abstract,您只需要静态访问,例如AdapterView.OnItemClickListener,因此编译错误如上所述。

即使您尝试创建implements OnItemClickListener只需要静态访问的具体类,例如class MyImpl implements MyAbstract.MyInterface

如果您注意到AdapterView

的签名
abstract class AdapterView<T extends Adapter>

表示AdapterView可以将Adapter或其任何子类型作为其参数。但是为了得到与Adapter相关联的元素(数据),AdapterView使用

Object getItem(int position);

正如你在里面看到的那样:

public Object getItemAtPosition(int position) {
    T adapter = getAdapter();
    return (adapter == null || position < 0) ? null : adapter.getItem(position);
}

需要在Squirrel内投射onItemClick。看看它是否有帮助!