2015-05-30 21 views
3

我有一個假想的SquirrelAdapterListView。事情是這樣的:Android的列表視圖。 AdapterView.OnItemClickListener中的參數化類型

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

在您試圖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。現在,要在abstract類中獲取interface的引用,您只需要靜態訪問,如AdapterView.OnItemClickListener,並因此如上所述編譯器錯誤。

即使你試圖創建implementsOnItemClickListener你有靜態只能訪問一個具體的類,如class MyImpl implements MyAbstract.MyInterface

如果你已經注意到AdapterView

abstract class AdapterView<T extends Adapter> 

的簽名表示,AdapterView能有Adapter或它的任何子類型作爲它的參數。但要獲得元素(數據)保持Adapter連接,AdapterView使用

Object getItem(int position); 

正如你可以看到裏面:你SquirrelonItemClick需要的

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

鑄造。看看它是否有幫助!