Java 如何在 FragmentPagerAdapter 中获取当前位置?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/9731859/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-16 06:51:29  来源:igfitidea点击:

how to get current position in FragmentPagerAdapter?

javaandroidandroid-viewpager

提问by r2DoesInc

I have an adapter that extends FragmentPagerAdapter and takes advantage of the ICS style actionBar. This actionbar has actions that take input from the currently selected page.

我有一个扩展 FragmentPagerAdapter 并利用 ICS 样式 actionBar 的适配器。此操作栏具有从当前所选页面获取输入的操作。

Specifically, I have a screenshot icon in the actionbar that takes the url of the current page and displays any screenshots from that url. However, I dont know how to retrieve the currently selected page.

具体来说,我在操作栏中有一个屏幕截图图标,它获取当前页面的 url 并显示来自该 url 的任何屏幕截图。但是,我不知道如何检索当前选择的页面。

How can I implement something like a

我怎样才能实现类似的东西

    public int getActivePage() {
       return position;

Im still working on the viewpager implementation, so my code is still heavily reliant on examples, so disregard the mess :P

我仍在研究 viewpager 实现,所以我的代码仍然严重依赖于示例,所以请忽略这些混乱:P

The problem areas are marked below.

问题区域如下所示。

public class ListFragmentViewPagerActivity extends FragmentActivity {
ArrayList<String> URLS;
ArrayList<String> TITLES;
BroadcastReceiver receiver;
String threadTitle = null;
public static String threadUrl = null;
String type = null;
String threadAuthor = null;
String ident = null;
boolean isFav = false;
String author = null;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.thread_view);

    Bundle extras = getIntent().getExtras();
    threadTitle = extras.getString("title");
    threadUrl = extras.getString("url");
    type = extras.getString("type");
    ident = extras.getString("ident");
    author = extras.getString("author");
    try {
        URLS = extras.getStringArrayList("urls");
        TITLES = extras.getStringArrayList("titles");
    } catch (Exception e) {
        URLS = null;
    }        

    final FDBAdapter db = new FDBAdapter(this);
    db.open();
    Cursor c = db.getAllFavs();
    if (c.getCount()>0) {
        if (c.getString(2).equals(threadTitle)) {
            isFav = true;
        }
            try {
                while (c.moveToNext()) {
                    Log.d("FAVS", c.getString(2));
                    if (c.getString(2).equals(threadTitle)) {
                        isFav = true;
                    }
                }
            } catch (Exception ep) {
                ep.printStackTrace();
            }
    }
    c.close();
    db.close();

    ViewPager pager = (ViewPager) findViewById(android.R.id.list);
    pager.setAdapter(new ExamplePagerAdapter(getSupportFragmentManager()));
    TitlePageIndicator indicator = (TitlePageIndicator)findViewById( R.id.indicator );
    indicator.setViewPager(pager);

    receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
                long downloadId = intent.getLongExtra(
                        DownloadManager.EXTRA_DOWNLOAD_ID, 0);

                String ns = Context.NOTIFICATION_SERVICE;
                NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(ns);

                int icon = R.drawable.ic_launcher;        // icon from resources
                CharSequence tickerText = "Download ready!";              // ticker-text
                long when = System.currentTimeMillis();         // notification time
                CharSequence contentTitle = "OMG";  // expanded message title
                CharSequence contentText = "Your download is finished!";      // expanded message text

                Intent notificationIntent = new Intent(context, ExampleListFragment.class);

                PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);

                Notification notification = new Notification(icon, tickerText, when);
                notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
                notification.defaults |= Notification.DEFAULT_VIBRATE;
                notification.flags |= Notification.FLAG_AUTO_CANCEL;
                final int HELLO_ID = 1;

                mNotificationManager.notify(HELLO_ID, notification);
            }
        }
};

registerReceiver(receiver, new IntentFilter(
        DownloadManager.ACTION_DOWNLOAD_COMPLETE));

}

public class ExamplePagerAdapter extends FragmentPagerAdapter implements TitleProvider{

    public ExamplePagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return URLS.size();
    }

    @Override
    public Fragment getItem(int position) {
        Fragment fragment = new ExampleListFragment();

        // set arguments here, if required
        Bundle args = new Bundle();
        args.putString("url", URLS.get(position));
        fragment.setArguments(args);

        return fragment;
    }

    @Override
    public String getTitle(int pos) {
        return TITLES.get(pos);
    }

}

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater menuinflate = new MenuInflater(this);
    menuinflate.inflate(R.menu.thread_menu, menu);
    if (type.equals("xda")) {
        menu.removeItem(R.id.ss_view);
    }
    if (isFav) {
        menu.getItem(2).setIcon(R.drawable.fav_ab);
    }
    return true;        
}   

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        case android.R.id.home:
            Intent intent = new Intent(this, MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
        break;
        case R.id.ss_view:
            Intent ssi = new Intent(this, SSActivity.class);
            ssi.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            Bundle b = new Bundle();

//I need to get the position of the currently active page here so that I can retrieve the //corresponding values for the title and url.
                b.putString("title", threadTitle);
                b.putString("url", threadUrl);
                ssi.putExtras(b);
                startActivity(ssi);
            break;
            case R.id.restart:
            break;
            case R.id.fav_ab:
                threadUrl = new String(threadUrl.replaceAll("http://", ""));
                FDBAdapter fdb = new FDBAdapter(this);
                fdb.open();             
                if (isFav) {
                    Cursor c = fdb.getAllUrls();
                      while (c.moveToNext()) {
                          String id = c.getString(c.getColumnIndex("_id"));
                          int rowId = Integer.parseInt(id);
                          if(c.getString(c.getColumnIndex("url")).equals(threadUrl)) {
                              if (fdb.deleteUrl(rowId)) {
                                  Log.d("THREAD", "SUCCESS");
                              } else {
                                  Log.d("THREAD", "FAILED");
                              }
                          }
                    }
                    c.close();
                    item.setIcon(R.drawable.fav_ab_off);
                    isFav = false;
                } else {
                    fdb.insertFav(threadUrl, threadTitle, ident, type, author, "thread");
                    item.setIcon(R.drawable.fav_ab);
                    isFav = true;
                }
                fdb.close();
            default:
                return super.onOptionsItemSelected(item);
        }
        return false;
    }

    @Override
    public void onStop() {
        super.onStop();
        unregisterReceiver(receiver);       
    }

    @Override
    public void onStart() {
        super.onStart();
        registerReceiver(receiver, new IntentFilter(
                DownloadManager.ACTION_DOWNLOAD_COMPLETE));
    }

}

Heres what I mean by the currently selected page.

这就是我所说的当前选定页面的意思。

enter image description here

enter image description here

采纳答案by Alex Fu

I believe what you are looking for is onPageChangedListener(). This method belongs to the TitlePageIndicator. Something like...

我相信您正在寻找的是 onPageChangedListener()。该方法属于 TitlePageIndicator。就像是...

indicator.setOnPageChangedListener(new OnPageChangedListener() {
// Implement unimplemented methods...
});

回答by Cabezas

you can also ask to viewpager

你也可以问viewpager

in java

在 Java 中

ViewPager pager = (ViewPager) findViewById(android.R.id.list);
pager.getCurrentItem()

in kotlin

在科特林

pager.currentItem