2016-11-03 25 views
0

我爲列表中的不同子適配器創建了一個基類,它具有一個List字段與泛型類型。類的代碼是如下:如何正確調用具有通用類型參數的方法,並取消「未經檢查的對原始類型成員的調用」警告

public class ListBaseAdapter<T> extends BaseAdapter { 
    private List<T> items; 

    @Override 
    public int getCount() { 
     if (items==null) 
      return 0; 
     return items.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     return null; 
    } 

    List getDataset() { 
     return items; 
    } 

    public void setDataset(List<T> items) { 
     this.items = items; 
    } 
} 

另外,下面是其不同的子類的一些例子:

public class UserListAdapter extends ListBaseAdapter {...} 
public class AddressListAdapter extends ListBaseAdapter {...} 

在ListFragment,一個ListBaseAdapter字段根據不同類型中聲明和初始化顯示列表。

public class TheListFragment extends ListFragment { 
    private ListBaseAdapter adapter; 

    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     ... 
     switch(type) { 
      case 1: 
       adapter = new UserListAdapter(); 
       adapter.setDataset(users); // this line of code is getting the warning of "unchecked call to member of raw type" 
       break; 
      case 2: 
       adapter = new AddressListAdapter(); 
       adapter.setDataset(addresses); // this line of code is getting the warning of "unchecked call to member of raw type" 
       break; 
     } 
     setListAdapter(adapter); 
    } 
} 

的代碼只是正常工作,我也知道,通過設置類型的ListBaseAdapter如下面的例子將擺脫的警告:

private ListBaseAdapter<Users> adapter; 

,但如果我做所以,我將不得不在ListFragment中準備多個具有特定類型的適配器。

我想知道是否有辦法擺脫警告(不使用林特),但仍然只維護一個適配器字段或我正確地做這種編碼方式?

回答

2

爲了您的例子時,你也應該有一個類型對其進行初始化,即:

public class UserListAdapter extends ListBaseAdapter<Users> {...} 
public class AddressListAdapter extends ListBaseAdapter<Address> {...} 

如果你想要保持只有一個參考,但仍然能夠在特定類型的傳遞,然後給予代碼你提供的,我建議你將沿着這些路線的東西:

public class TheListFragment extends ListFragment { 
    // You really don't even need to keep a reference to this 
    // since it can be retrieved with getListAdapter() 
    private ListBaseAdapter<?> adapter; 

    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     ... 
     switch(type) { 
      case 1: 
       UserListAdapter userAdapter = new UserListAdapter(); 
       userAdapter.setDataset(users); 
       adapter = userAdapter; 
       break; 
      case 2: 
       AddressListAdapter addressAdapter = new AddressListAdapter(); 
       addressAdapter.setDataset(addresses); 
       adapter = addressAdapter; 
       break; 
     } 

     setListAdapter(adapter); 
    } 
} 

假設你並不需要做未來的數據分配到適配器,會做的伎倆。您的字段僅爲ListBaseAdapter<?>類型,但您的本地變量是特定類型的,因此您可以直接使用它們,然後將它們分配給更弱的字段adapter

+0

太棒了,+1 ..!作爲* Android *標籤的頂級用戶,您可以回答這個簡短的問題嗎?我應該每個**類**或**文件**或**項目**都有一個'public static void main(){}'方法嗎? – stack

相關問題