草庐IT

android - 将抽屉导航订阅到 Observable

coder 2023-11-26 原文

我想通过订阅一个 Observable 来填充抽屉导航,它从数据库获取数据,完成后通知订阅者(使用 RxJava)。我做了类似的事情,Subscriber 是一个扩展 Fragment 的类,但不同之处在于 Navigation Drawer 不是一个单独的 fragment ,而是被定义的在主要 Activity 中。

如何将 Navigation Drawer 订阅到 Observable

主 Activity .java

private DrawerLayout mDrawerLayout;
private ListView mDrawerList;

@Override
public void onStart() {                                                                                                                       mLoadAndStoreDataObservable = Observable.create(
    super.onStart();                                                                                                                              new Observable.OnSubscribe<String>() {

    // fragment creation code was here

    // populates a String[] myStringArray for Navigation Drawer                                                                                                                                                                  permitsSQLiteManager.addLogLine(mActivity, logString);
    if (!skipRestfulServiceCall) {
        getDataFromRestfulService();                                                                                                                      }
    }                                                                                                                                                     catch (Exception e) {
    else {  // get data from SQLite                                                                                                                           Log.e("loadAndStoreData  ", "Exception: " + e.getMessage());
        getDataFromSQLite();                                                                                                                                  mProgressDialog.dismiss();
    }                                                                                                                                                     }
                                                                                                                                                      }
    mTitle = mDrawerTitle = getTitle();                                                                                                           }
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);                                                                              .subscribeOn(Schedulers.io())
    mDrawerList = (ListView) findViewById(R.id.left_drawer);                                                                                      .observeOn(AndroidSchedulers.mainThread())
                                                                                                                                                  .subscribe(mDrawerLayout); // parameter was a Fragment
    mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);

    mDrawerList.setAdapter(new ArrayAdapter<String>(this,  R.layout.drawer_list_item, myStringArray));
    mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

    // enable ActionBar app icon to behave as action to toggle nav drawer
    getActionBar().setDisplayHomeAsUpEnabled(true);
    getActionBar().setHomeButtonEnabled(true);

    mDrawerToggle = new ActionBarDrawerToggle(this,mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open,R.string.drawer_close
    ) {
        public void onDrawerClosed(View view) {
            getActionBar().setTitle(mTitle);
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        }

        public void onDrawerOpened(View drawerView) {
            getActionBar().setTitle(mDrawerTitle);
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        }
    };
    mDrawerLayout.setDrawerListener(mDrawerToggle);
}

private void getDataFromRestfulService() {

    <get data>


    // implement RxJava-Observable/Subscriber
    mLoadAndStoreDataObservable = Observable.create(
            new Observable.OnSubscribe<String>() {
                @Override
                public void call(Subscriber<? super String> subscriber) {

                    try {
                        Utilities.loadAndStoreData(mActivity);
                        subscriber.onNext("Utilities.loadAndStoreData Done");
                        //subscriber.onCompleted();
                        Log.e("MainActivity.onCreate()", "subscriber.onNext(\"Utilities.loadAndStoreData Done\")");

                        String logString = "MainActivity.onCreate() - subscriber.onNext(Utilities.loadAndStoreData Done)";
                        Log.e(TAG, logString);
                        PermitsSQLiteManager permitsSQLiteManager = PermitsSQLiteManager.getInstance();
                        permitsSQLiteManager.addLogLine(mActivity, logString);

                        mProgressDialog.dismiss();
                    }
                    catch (Exception e) {
                        Log.e("loadAndStoreData  ", "Exception: " + e.getMessage());
                        subscriber.onError(e);
                        mProgressDialog.dismiss();
                    }
                }
            }
    )
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(mDrawerLayout); // compile error // suscriber was a Fragment, but no longer
}

最佳答案

如果 mDrawerLayout 是实现 Observer 的类的实例,那么您可以将其转换为 Observer

NavigationDrawer mDrawerLayout = ...
yourObservable.subscribe((Observer)mDrawerLayout);

如果它没有实现Observer 接口(interface),那么您可以创建一个新的Observer 来操纵您的抽屉导航。 (您可能需要将 mDrawerLayout 声明为 final)

final NavigationDrawer  mDrawerLayout = ...
yourObservable.subscribe(new Observer<String>() {
                @Override
                public void onCompleted() {
                    // on completed
                }

                @Override
                public void onError(Throwable throwable) {
                    // on error
                }

                @Override
                public void onNext(String people) {
                        mDrawerLayout.doSomething(); 
                }
            });

关于android - 将抽屉导航订阅到 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31279443/

有关android - 将抽屉导航订阅到 Observable的更多相关文章

  1. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  2. ruby-on-rails - 在 Rails 3 中向 Active Admin 添加全局导航项的最佳方法是什么 - 2

    我正在尝试将全局导航菜单项添加到我的ActiveAdmin安装(在“仪表板”导航按钮旁边)。ActiveAdmin说这在他们的网站上是可能的,但他们没有任何关于如何实现它的文档。有谁知道如何做到这一点?编辑:抱歉,我应该更清楚。我想添加一个指向由任意文本/链接对组成的全局导航的链接。IE,如果我想添加一个链接到http://google.com在事件管理员的全局导航中使用文本“Google”,我将如何实现? 最佳答案 ActiveAdmin.register_page"Google"domenu:priority=>1,:label

  3. 千耘农机导航的“星地一体”能力究竟是什么? - 2

    伴随农业机械化和智能化的发展,越来越多的人开始使用农机自动驾驶系统助力耕作,千耘农机导航的“星地一体”能力可有效解决信号受限的问题,实现作业提效。究竟什么是“星地一体”,又是如何解决智能化农机作业的痛点的?下面为大家揭秘。农机效率通常受限于通信网络目前虽然我国通讯网络的人口覆盖率达到99%,但地面移动通讯网络覆盖率仍小于国土面积的40%,而很多农田所在区域恰是山区、戈壁滩等偏远地区。两省交界地也会出现通信信号不稳定的状况;而国内大部分农机自动驾驶系统非常依赖通信网络,当通信网络弱的时候会出现系统掉线的现象,必须得携带小基站才能正常使用,极为繁琐。Q:什么是千耘农机导航“星地一体”能力?A:是星

  4. ruby-on-rails - 无法使用 Stripe 保存或取消订阅 - 2

    将stripe的API与RubyonRails结合使用我无法保存订阅。我能够检索、更新和保存客户对象:customer=Stripe::Customer.retrieve(some_customer_id)#thisworkscustomer.save#thisworks我还可以检索订阅:subscription=customer.subscriptions.retrieve("some_subscription_id")#这个有效但是,在尝试保存订阅时:subscription.save#这不起作用我不断得到这个:NoMethodError:undefinedmethod`save'

  5. ruby-on-rails - 在 Rails 中是否有比 Observers 更直接的方式来执行发布/订阅模式? - 2

    我有一个模型依赖于一个单独的、联合的模型。classMagazine图像是多态的,可以附加到许多对象(页面和文章),而不仅仅是杂志。杂志需要在相关图像发生任何变化时自行更新该杂志还保存了一张自己的截图,可用于宣传:classMagazine现在如果图像发生变化,杂志也需要更新其截图。所以杂志真的需要知道图片什么时候出了问题。所以我们可以天真地直接从封面图片触发屏幕截图更新classImage...但是图片不应该代表杂志做事然而,图片可以用于许多不同的对象,实际上不应该对杂志进行特定的操作,因为这不是图片的责任。该图像也可能附加到页面或文章,并且不需要为它们做各种事情。“正常”的rail

  6. ruby-on-rails - 在 ActionCable 中找不到订阅类 'MyChannel' - 2

    我在使用ActionCable时遇到问题,每当我运行我的程序时,我都会收到一条错误消息,提示SubscriptionClassnotfoundConversationChannel当我尝试发送消息时,我得到了这个日志SuccessfullyupgradedtoWebSocket(REQUEST_METHOD:GET,HTTP_CONNECTION:Upgrade,HTTP_UPGRADE:websocket)Subscriptionclassnotfound:"ConversationChannel"Couldnotexecutecommandfrom{"command"=>"mess

  7. ruby - AMQP 动态创建订阅队列 - 2

    我正在尝试使用AMQP、Websockets和Ruby构建一个简单的聊天应用程序。我知道这可能不是理解AMQP的最佳用例,但我想了解我哪里出错了。以下是我的amqp-server代码require'rubygems'require'amqp'require'mongo'require'em-websocket'require'json'classMessageParser#messageformat=>"room:harry_potter,nickname:siddharth,room:members"defself.parse(message)parsed_message=JSON.

  8. Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信) - 2

    运行有问题或需要源码请点赞关注收藏后评论区留言一、利用ContentResolver读写联系人在实际开发中,普通App很少会开放数据接口给其他应用访问。内容组件能够派上用场的情况往往是App想要访问系统应用的通讯数据,比如查看联系人,短信,通话记录等等,以及对这些通讯数据及逆行增删改查。首先要给AndroidMaifest.xml中添加响应的权限配置 下面是往手机通讯录添加联系人信息的例子效果如下分成三个步骤先查出联系人的基本信息,然后查询联系人号码,再查询联系人邮箱代码 ContactAddActivity类packagecom.example.chapter07;importandroid

  9. Android 10.0 设置默认launcher后安装另外launcher后默认Launcher失效的功能修复 - 2

    1.前言 在10.0的系统rom定制化开发中,在系统中有多个launcher的时候,会在开机进入launcher的时候弹窗launcher列表,让用户选择进入哪个launcher,这样显得特别的不方便所以产品开发中,要求用RoleManager的相关api来设置默认Launcher,但是在设置完默认Launcher以后,在安装一款Launcher的时候,默认Launcher就会失效,在系统设置的默认应用中Launcher选项就为空,点击home键的时候会弹出默认Launcher列表,让选择进入哪个默认Launcher.所以需要从安装Launcher的流程来分析相关的设置。来解决问题设置默认La

  10. ruby-on-rails - 如何在不创建空模型的情况下创建 rails_admin 导航标签? - 2

    在railsadmin中,您可以像这样为模型及其子项定义导航标签:#inrails_admin.rbconfig.modelOrderdonavigation_label'Ordersrelated'endconfig.modelOrderProductsdoparentOrderend有没有办法在不创建模型的情况下向导航菜单添加标签(即仅用于分组)? 最佳答案 根据wiki,您可以像这样将静态链接附加到导航:RailsAdmin.configdo|config|config.navigation_static_links={'Go

随机推荐