2016-11-03 1 views
0

リストフィールドを持つmyリスト用の異なるアダプタのサブクラスの基本クラスを作成しましたジェネリック型。クラスのコードは以下の通りである:ジェネリック型のパラメータを持つメソッドを正しく呼び出し、「未処理の型のメンバへの未確認の呼び出し」を回避する方法警告

以下また
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; 
    } 
} 

は、それとは異なるサブクラスのいくつかの例である:ListFragmentで

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

、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内で、それぞれが特定の型の複数のアダプタを用意しなければならないでしょう。

警告(Lintを使用しない)を取り除く方法があるのですが、まだ1つのアダプタフィールドしか保持していないのでしょうか、それとも正しくこの方法でコードを書いていますか?

答えて

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タグのトップユーザーとしても、この短い質問にお答えできますか? **クラス**または**ファイル**または**プロジェクト**のそれぞれについて、1つの 'public static void main(){}'メソッドを持つべきですか? – stack

関連する問題