简体   繁体   English

创建ArrayAdapter的自定义Abstract类

[英]Creating a custom Abstract class of ArrayAdapter

I'd like to create my own abstract version of ArrayAdapter which adds functionality of custom Intent Navigation and Toast popups among others. 我想创建自己的ArrayAdapter抽象版本,其中添加了自定义Intent Navigation和Toast弹出窗口的功能。

Here is an example of my custom Activity: 这是我的自定义活动的示例:

public abstract class RBActivity extends Activity implements IActivity {

    private Navigator navigator;
    private Toaster toaster;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        navigator = new Navigator(this);
        toaster = new Toaster(this);
    }

    public Navigator navigate() {
        return navigator;
    }

    protected void popBurntToast(String msg) {
        toaster.popBurntToast(msg);
    }

    protected void popToast(String msg) {
        toaster.popToast(msg);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        navigator = null;
        toaster = null;
    }   
}

Then within my Activity's i simply extend from RBActivity instead of Activity . 然后在我的Activity中,我只是从RBActivity而不是Activity扩展。 I then can call this.navigate().toSomeActivity(); 然后,我可以调用this.navigate()。toSomeActivity(); using my Navigator class which has methods for easily creating intents to navigate around my application. 使用我的Navigator classNavigator class具有轻松创建用于在应用程序中导航的意图的方法。 I also have my own RBListActivity etc 我也有自己的RBListActivity

Here is a sample method from my navigator class: 这是我的导航器类中的示例方法:

public void toSiteSubscribeActivity(Site _site) {
    Intent intent = new Intent(activity, SiteSubscribeActivity.class);
    Bundle b = new Bundle();
    b.putLong(Navigator.INTENT_KEY_CHANNEL_ID, _site.getIdSite());
    b.putString(Navigator.INTENT_KEY_CHANNEL_NAME, _site.getName());
    b.putString(Navigator.INTENT_KEY_CHANNEL_DESCRIPTION, _site.getDescription());
    intent.putExtras(b);
    activity.startActivity(intent);
}    

Anyway, I want to also have a RBArrayAdapter<> but I'm not sure how to create a generic version which doesn't require i specify the class type within the <> braces ie, 无论如何,我也想拥有一个RBArrayAdapter <>,但是我不确定如何创建一个通用版本,该版本不需要我在<>大括号内指定类类型,即,

public abstract class RBArrayAdapter extends ArrayAdapter<Article> {
    private Navigator navigator;
    private Toaster toaster;

    public RBArrayAdapter(Activity _activity, int _layout, ArrayList<Article> _notes) {
        super(_activity, _layout, _notes);

        navigator = new Navigator(_activity);
        toaster = new Toaster(_activity);
    }


    public Navigator navigate() {
        return navigator;
    }   
}

I tried doing something like public abstract class RBArrayAdapter extends ArrayAdapter<?> but it obviously doesn't work... 我尝试做一些类似public abstract class RBArrayAdapter extends ArrayAdapter<?>但显然不起作用...

I guess in short, I'm asking how to accept a generic class type within the pointy braces 简而言之,我想问的是如何在尖括号内接受通用类类型

Any help is really appreciated, Cheers 非常感谢任何帮助,干杯

EDIT: ok after looking at ArrayAdapter.java ( https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/ArrayAdapter.java ) I think what i need is ArrayAdapter<T> Syntax. 编辑:在查看ArrayAdapter.java之后可以( https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/ArrayAdapter.java )我认为我需要的是ArrayAdapter<T>语法。 looking into that now 现在看

If I understand you correctly, you just need the syntax to make this work. 如果我对您的理解正确,则只需要使用语法即可完成这项工作。 Try this: 尝试这个:

public abstract class RBArrayAdapter<T> extends ArrayAdapter<T> {
    private Navigator navigator;
    private Toaster toaster;

    public RBArrayAdapter(Activity _activity, int _layout, ArrayList<T> _notes) {
        super(_activity, _layout, _notes);

        navigator = new Navigator(_activity);
        toaster = new Toaster(_activity);
    }


    public Navigator navigate() {
        return navigator;
    }   
}

Then you should be able to substitute any parameter you like for <T> when you instantiate your RBArrayAdapter subclass (something like this): 然后,当您实例化RBArrayAdapter子类时,应该可以将您喜欢的任何参数替换为<T> (类似这样):

public class MyStringArrayAdapter extends RBArrayAdapter<String> {

    public MyStringArrayAdapter(Activity _activity, int _layout, ArrayList<String> _notes) {
      super(_activity, _layout, _notes);
    }

}

Have fun. 玩得开心。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM