草庐IT

android - 我的 View Pager Adapter 中的 instantiateItem() 如何工作?

coder 2023-12-16 原文

我想达到什么目的?

我有 5 张图片的 url 链接。我希望它们以幻灯片的形式显示在我的主屏幕上。

我知道该怎么做吗?

据我所知,是的。我能够在主屏幕内以自动幻灯片的形式显示 5 张图像

那问题是什么?

正在加载的第一个图像实际上来自第二个索引位置的 url,即第三个 url。

我在文本中所做的事情的概述

我已经将图像的 url 存储在一个字符串数组中。我将我的主屏幕上下文和 url 数组传递给我的 View Pager Adapter。我在 Adapter 的 instantiateItem() 方法中使用 Glide 来显示图像

代码

HomeScreenTopPagerAdapter.java

public class HomeScreenTopPagerAdapter extends PagerAdapter {

    private String[] urls;
    private LayoutInflater layoutInflater;
    private Context context;
    private int custom_position = 0;

    public  HomeScreenTopPagerAdapter(Context context, String[] urls){
        this.context = context;
        this.urls = urls;
        layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return Integer.MAX_VALUE;           //to make automatic image slider come back to first image smoothly, by hypothetically making the image views infinite
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
        return view==o;
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull final ViewGroup container, int position) {

        if(custom_position>urls.length-1)        //done for a smooth transition when there is a slideshow between last image and the first one
            custom_position=0;

        View view = layoutInflater.inflate(R.layout.home_screen_topimageslider,container,false);
        ImageView imageView = view.findViewById(R.id.topImageSliderImageView);
        final ProgressBar progressBar = ((HomeScreen)context).findViewById(R.id.progresBarHomeScreenTop);
        progressBar.setVisibility(View.VISIBLE);

        GlideApp.with(context)
                .load(urls[custom_position])
                .listener(new RequestListener<Drawable>() {
                    @Override
                    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                        progressBar.setVisibility(View.GONE);
                        Toast.makeText(context,"Please Check Your Internet Connection",Toast.LENGTH_LONG).show();
                        Log.i("In Glide Loading Failed",Integer.toString(custom_position));
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                        progressBar.setVisibility(View.GONE);
                        Log.i("In Glide Resource Ready",Integer.toString(custom_position));
                        //((HomeScreen)context).prepareDots(custom_position);
                        return false;
                    }
                })
                .diskCacheStrategy(DiskCacheStrategy.NONE)
                .into(imageView);

        container.addView(view);
        Log.i("Outside Glide ",Integer.toString(custom_position));
        custom_position++;
        return view;
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        View view = (View)object;
        container.removeView(view);
    }
}

Logcat

2019-06-19 09:50:46.728 29185-29185/? I/Outside Glide: 0
2019-06-19 09:50:46.731 29185-29185/? I/Outside Glide: 1
2019-06-19 09:50:46.741 29185-29210/? I/Adreno: QUALCOMM build                   : 4c638fb, I557c585805
    Build Date                       : 10/06/18
    OpenGL ES Shader Compiler Version: EV031.25.03.01
    Local Branch                     : 
    Remote Branch                    : 
    Remote Branch                    : 
    Reconstruct Branch               : 
2019-06-19 09:50:46.742 29185-29210/? I/Adreno: Build Config                     : S L 6.0.7 AArch64
2019-06-19 09:50:46.745 29185-29210/? I/Adreno: PFP: 0x005ff112, ME: 0x005ff066
2019-06-19 09:50:46.748 29185-29210/? I/ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasWideColorDisplay retrieved: 0
2019-06-19 09:50:46.748 29185-29210/? I/ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasHDRDisplay retrieved: 0
2019-06-19 09:50:46.749 29185-29210/? I/OpenGLRenderer: Initialized EGL, version 1.4
2019-06-19 09:50:46.770 29185-29216/? I/DpmTcmClient: RegisterTcmMonitor from: com.android.okhttp.TcmIdleTimerMonitor
2019-06-19 09:50:48.034 29185-29185/com.example.gofresh I/In Glide Resource Ready: 2
2019-06-19 09:50:48.204 29185-29185/com.example.gofresh I/In Glide Resource Ready: 2
2019-06-19 09:50:52.324 29185-29185/? I/Outside Glide: 2
2019-06-19 09:50:52.953 29185-29185/? I/In Glide Resource Ready: 3
2019-06-19 09:50:55.066 29185-29185/? I/Outside Glide: 3
2019-06-19 09:50:55.722 29185-29185/? I/In Glide Resource Ready: 4
2019-06-19 09:50:57.273 29185-29185/? I/Outside Glide: 4
2019-06-19 09:50:58.611 29185-29185/? I/In Glide Resource Ready: 5
2019-06-19 09:50:59.327 29185-29185/? I/Outside Glide: 0
2019-06-19 09:50:59.342 29185-29185/? I/In Glide Resource Ready: 1
2019-06-19 09:51:03.633 29185-29185/? I/Outside Glide: 1
2019-06-19 09:51:03.655 29185-29185/? I/In Glide Resource Ready: 2

正如您从 Logcat 中看到的那样,仅当发生 Outside Glide: 0 和 Outside Glide: 1 时,它才会进入 Glide Method。我无法理解这个 instantiateItem() 方法实际上是如何工作的。

此外,我假设每当 In Glide Resource Ready 将显示在 Log 中时,紧接着将显示 Outside Glide(即对于特定索引位置的图像,两者将同时显示),但是 Outside Glide 是ONLY AFTER 幻灯片显示到下一张图片。简而言之,每当幻灯片放映到一张图片时,就会显示带有前一张图片索引位置的 Outside Glide,然后显示带有当前图片索引的 In Glide Resource Ready。

Homescreen.java

    private ViewPager viewPager;
    private HomeScreenTopPagerAdapter adapter;
    private String[] urls = {"https://picsum.photos/420/200/?temp=1",               ///?temp=randomNo/String doesn't change the URL. Added so that each image is random
                     "https://picsum.photos/420/200/?temp=2",
                     "https://picsum.photos/420/200/?temp=3",
                     "https://picsum.photos/420/200/?temp=4",
                     "https://picsum.photos/420/200/?temp=5"};
    private Timer timer;
    private int current_position = 0;
    private LinearLayout dotsLayout;
    private int custom_position = 0;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home_screen);

        instantiateViews();
        viewPager.setAdapter(adapter);
        createSlideShow();
    }

public void instantiateViews(){

        viewPager = findViewById(R.id.topImageSliderViewPager);
        adapter = new HomeScreenTopPagerAdapter(HomeScreen.this,urls);
        dotsLayout = findViewById(R.id.hs_dotsLayout);

    }

public void createSlideShow(){
        final Handler handler = new Handler();
        final Runnable runnable = new Runnable() {
            @Override
            public void run() {
                if(current_position==Integer.MAX_VALUE)
                    current_position=0;
                viewPager.setCurrentItem(current_position++,true);
            }
        };

        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                handler.post(runnable);
            }
        },1000,3000);
    }
}

最佳答案

花了很多时间后,我找到了如何加载第一个图像而不是第三个图像的答案。

public Object instantiateItem(@NonNull final ViewGroup container, final int position) {
        .
        .
        .

        GlideApp.with(context)
                .load(urls[position%urls.length])   //THE CHANGE MADE HERE, completely removed the usage of custom_position variable
                .
                .
}

注意:这只回答了如何获得所需的结果,它仍然没有回答 instantiateItem() 是如何工作的,显示出意想不到的结果。我是初学者,只有有经验的人才能用上面的方法解释错误。

关于android - 我的 View Pager Adapter 中的 instantiateItem() 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56660108/

有关android - 我的 View Pager Adapter 中的 instantiateItem() 如何工作?的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  4. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  5. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  6. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  7. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  8. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  9. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  10. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

随机推荐