5

我的应用活动之一称为 DayGallery 活动(无限图片库),

当我打开图库时,它会随机显示第一张图片,而不是从我在 DayGallery 活动代码中指定的第一张图片开始。

我想要实现的是:

FIRST:从 DayGallery 活动代码中指定的第一张图片开始,如下所示:

打开 Day1 画廊时,出现的第一张图片是:

R.drawable.day_one_1

当打开 Day2 画廊时,出现的第一张图片是:

R.drawable.day_two_1

就像所有天画廊一样,两边也保持无限滚动。

第二:如果我在画廊中停止在名为day_one_7的图像上,然后按返回以转到上一个活动并再次返回到画廊,我想看到我在离开画廊之前看到的相同图像,但如果我退出应用程序然后打开再次画廊,它必须重置以显示我在 DayGallery 活动代码中指定的第一张图片,如下图所示。

在此处输入图像描述

实际上我为此目的搜索了谷歌,但我找不到任何有用的东西,

任何帮助将不胜感激。

DayGallery.java:

 @SuppressWarnings("deprecation")
public class DayGallery extends Activity {
TextView tv;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
            WindowManager.LayoutParams.FLAG_FULLSCREEN);  
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    Boolean customTitleSupported = requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 
    // Set the layout to use
    setContentView(R.layout.main);
    if (customTitleSupported) { 
        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.custom_title); 
         tv = (TextView) findViewById(R.id.title_tv1); 
         tv.setTypeface(FontFactory.getBFantezy(getBaseContext()));
         }           
    InfiniteGallery galleryOne = (InfiniteGallery) findViewById(R.id.galleryOne);
    galleryOne.setAdapter(initializeImages()); 
    galleryOne.setSelection(galleryOne.getCount()/2);  
    }  

private InfiniteGalleryAdapter initializeImages() {
    InfiniteGalleryAdapter galleryAdapter = null;

    String day = getIntent().getStringExtra("dayname");

    if(day.equalsIgnoreCase("Day1")){
        int[] tempimages = { R.drawable.day_one_1, R.drawable.day_one_2,R.drawable.day_one_3, 
                R.drawable.day_one_4, R.drawable.day_one_5,R.drawable.day_one_6,R.drawable.day_one_7,       
                R.drawable.day_one_8, R.drawable.day_one_9,R.drawable.day_one_10,R.drawable.day_one_11,
                R.drawable.day_one_12
        };  
        String[] name = { "00:35","00:35","00:35","1:07","2:00","2:01","2:09",
                          "2:12","2:15","6:13","6:13","6:13"
        };  
        tv.setText("Day one pictures");
        galleryAdapter=new InfiniteGalleryAdapter(this, tempimages, name); 
        }       
    else if(day.equalsIgnoreCase("Day2")){
        int[] tempimages = { R.drawable.day_two_1, R.drawable.day_two_2,R.drawable.day_two_3, 
                R.drawable.day_two_4, R.drawable.day_two_5,R.drawable.day_two_6,R.drawable.day_two_7,
                R.drawable.day_two_8, R.drawable.day_two_9,R.drawable.day_two_10,R.drawable.day_two_11,
                R.drawable.day_two_12
        };  
        String[] name = { "12:04","12:04", "12:04","12:05","12:06", "12:07",
                          "12:07","12:07","12:08","12:10","12:10","12:10"
        };  
        tv.setText("Day two pictures"); 
        galleryAdapter=new InfiniteGalleryAdapter(this, tempimages, name); 
        }

    // AND THE SAME FOR REST OF DAYS TILL Day10//

    return galleryAdapter; 
    }
}

 class InfiniteGalleryAdapter extends BaseAdapter { 
private Context mContext;
private int[] images;   
private String[] name;
public InfiniteGalleryAdapter(Context c, int[] imageIds,String[] names) { 
    this.mContext = c; 
    images = imageIds;
    name=names;
    inflater = (LayoutInflater)mContext.getSystemService ( Context.LAYOUT_INFLATER_SERVICE); 
    } 
public int getCount() { 
    return Integer.MAX_VALUE; 
    } 
public Object getItem(int position) { 
    return position; 
    } 
public long getItemId(int position) { 
    return position; 
    } 
private LayoutInflater inflater=null; 

public class ViewHolder{ 
    public TextView text; 
    public ImageView image; 
    } 

public View getView(int position, View convertView, ViewGroup parent) { 
    ImageView i = getImageView(); 

    int itemPos = (position % images.length); 

    try { i.setImageResource(images[itemPos]); ((BitmapDrawable) i.getDrawable()).setAntiAlias(true); 
    } 
    catch (OutOfMemoryError e) { Log.e("InfiniteGalleryAdapter", "Out of memory creating imageview. Using empty view.", e); 
    } 
    View vi=convertView; 
    ViewHolder holder; 
    if(convertView==null){ 
        vi = inflater.inflate(R.layout.gallery_items, null); 
        holder=new ViewHolder(); 
        holder.text=(TextView)vi.findViewById(R.id.textView1); 
        holder.image=(ImageView)vi.findViewById(R.id.image); 
        vi.setTag(holder); 
        } 
    else holder=(ViewHolder)vi.getTag(); 
    holder.text.setText(name[itemPos]); 

    final int stub_id=images[itemPos]; 
    holder.image.setImageResource(stub_id); 

    return vi; 
    } 

private ImageView getImageView() { 

    ImageView i = new ImageView(mContext); 

    return i; 
    } 
}

  @SuppressWarnings("deprecation")
 class InfiniteGallery extends Gallery {

public InfiniteGallery(Context context) {
    super(context);
    init(); 
    }

public InfiniteGallery(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(); 
    }

public InfiniteGallery(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(); 
    }

private void init(){
    // These are just to make it look pretty
    setSpacing(25);
    setHorizontalFadingEdgeEnabled(false); 
    }
}

更新:

我添加这行代码:

 galleryOne.setSelection(0);

在此行之后:

galleryOne.setSelection(galleryOne.getCount()/2);  

在我的代码中,它会导致显示在 DayGallery 活动中指定的第一张图像,但它会导致单向无限滚动到左侧而不是两侧,

我们如何通过显示 DayGallery 活动中指定的第一个图像来获得我的画廊图像的双向无限滚动?

非常感谢任何帮助,谢谢。

4

1 回答 1

1

我可以告诉你编写使用片段的无限浏览器的逻辑。此查看器可以在两个方向上无限滚动。它也可以从任何特定的片段启动。我的要求是:

我有一本电子书,用户可以点击任何菜单(章节),它应该会启动它,然后应该可以双向滚动。我猜你正试图通过画廊实现同样的目标:

检查代码:

InfinitePagerAdapter.java:

package com.example.multiplepages;

import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;

/**
 * A PagerAdapter that wraps around another PagerAdapter to handle paging
 * wrap-around.
 * 
 */
public class InfinitePagerAdapter extends PagerAdapter {

    private static final String TAG = "InfinitePagerAdapter";
    private static final boolean DEBUG = true;

    private PagerAdapter adapter;

    public InfinitePagerAdapter(PagerAdapter adapter) {
    this.adapter = adapter;
    }

    @Override
    public int getCount() {
    // warning: scrolling to very high values (1,000,000+) results in
    // strange drawing behaviour
    return Integer.MAX_VALUE;

    }

    /**
     * @return the {@link #getCount()} result of the wrapped adapter
     */
    public int getRealCount() {
    return adapter.getCount();
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        debug("getRealCount: " + getRealCount());
        int virtualPosition = position % getRealCount();
        debug("instantiateItem: real position: " + position);
        debug("instantiateItem: virtual position: " + virtualPosition);

        // only expose virtual position to the inner adapter
        return adapter.instantiateItem(container, virtualPosition);
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
    int virtualPosition = position % getRealCount();
    debug("destroyItem: real position: " + position);
    debug("destroyItem: virtual position: " + virtualPosition);

    // only expose virtual position to the inner adapter
    adapter.destroyItem(container, virtualPosition, object);
    }

    /*
     * Delegate rest of methods directly to the inner adapter.
     */

    @Override
    public void finishUpdate(ViewGroup container) {
    adapter.finishUpdate(container);
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
    return adapter.isViewFromObject(view, object);
    }

    @Override
    public void restoreState(Parcelable bundle, ClassLoader classLoader) {
    adapter.restoreState(bundle, classLoader);
    }

    @Override
    public Parcelable saveState() {
    return adapter.saveState();
    }

    @Override
    public void startUpdate(ViewGroup container) {
    adapter.startUpdate(container);
    }

    /*
     * End delegation
     */

    private void debug(String message) {
    if (DEBUG) {
        Log.d(TAG, message);
    }
    }
}

InfiniteViewPager.java:

package com.example.multiplepages;


import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;

/**
 * A {@link ViewPager} that allows pseudo-infinite paging with a wrap-around
 * effect. Should be used with an {@link InfinitePagerAdapter}.
 * 
 */
public class InfiniteViewPager extends ViewPager {

    int mPageOffset = 0;

    public InfiniteViewPager(Context context) {
    super(context);
    }

    public InfiniteViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
    }

    @Override
    public void setAdapter(PagerAdapter adapter) {
    super.setAdapter(adapter);
    // offset first element so that we can scroll to the left
    setCurrentItem(0);
    }

    public void setpageOffset(int pageOffset) {
        mPageOffset = pageOffset;
    }

   @Override
    public void setCurrentItem(int item) {
    // offset the current item to ensure there is space to scroll
    item = getOffsetAmount() + (item % getAdapter().getCount());
    item = item + mPageOffset;
    super.setCurrentItem(item);

    }

    private int getOffsetAmount() {
    if (getAdapter() instanceof InfinitePagerAdapter) {
        InfinitePagerAdapter infAdapter = (InfinitePagerAdapter) getAdapter();
        // allow for 100 back cycles from the beginning
        // should be enough to create an illusion of infinity
        // warning: scrolling to very high values (1,000,000+) results in
        // strange drawing behaviour
        return infAdapter.getRealCount() * 100;
    } else {
        return 0;
    }
    }

}

MultiplePageScroll.java :这是 MainActivity

package com.example.multiplepages;

import java.util.ArrayList;
import java.util.List;

import android.content.pm.ActivityInfo;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.widget.ProgressBar;
import android.support.v4.app.Fragment;  
import android.support.v4.app.FragmentActivity;  
import android.support.v4.app.FragmentManager;  
import android.support.v4.app.FragmentPagerAdapter;  
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager; 
import android.support.v4.view.ViewPager.OnPageChangeListener;

public class MultiplePageScroll extends FragmentActivity  {

    private int listSize = 0;
    public int listPos = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_multiple_page_scroll);
        Bundle bundle = getIntent().getExtras(); 
        listSize = bundle.getInt("listSize");
        listPos = bundle.getInt("itemPosition");

        PagerAdapter adapter = new FragmentPagerAdapter(getSupportFragmentManager()) {

            @Override
            public int getCount() {
            return listSize;
            }

            @Override
            public Fragment getItem(int position) {
            Fragment fragment = new PageFragment();
            Bundle args = new Bundle();
            args.putInt("identifier", position);
            fragment.setArguments(args);
            return fragment;
            }
        };

        // wrap pager to provide infinite paging with wrap-around
        PagerAdapter wrappedAdapter = new InfinitePagerAdapter(adapter);

        // actually an InfiniteViewPager
        InfiniteViewPager viewPager = (InfiniteViewPager) findViewById(R.id.pager);
        viewPager.setpageOffset(listPos);
        viewPager.setAdapter(wrappedAdapter);

    }
}

PageFragment.java:

package com.example.multiplepages;

import java.io.IOException;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v4.app.Fragment;  
import android.util.Log;
import android.view.GestureDetector;
import android.view.KeyEvent;
import android.view.LayoutInflater;  
import android.view.MotionEvent;
import android.view.View;  
import android.view.ViewGroup;  
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;
import android.widget.TextView;  
//import android.webkit.WebSettings;
import android.widget.Toast;


public class PageFragment extends Fragment { 

    String path="s_english/contents";
    AssetManager assMan = null;
    int pageIndex;
    String pagePath = null;    
    String[] pageList = null; 
    private int listPosition;

     public static PageFragment newInstance(int index) {

         PageFragment pageFragment = new PageFragment();
         Bundle bundle = new Bundle();
         bundle.putInt("index", index);
         pageFragment.setArguments(bundle);
         return pageFragment;
     }

     @Override  
     public void onCreate(Bundle savedInstanceState) {  
         super.onCreate(savedInstanceState); 
        Bundle args = getArguments();
        listPosition = args.getInt("identifier");
     }  

     @Override  
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  

         View view = inflater.inflate(R.layout.fragment, container, false);  
         WebView mWebView = (WebView) view.findViewById(R.id.webview);
         mWebView.addJavascriptInterface(new JavaScriptInterface(getActivity()), "NativeFunc");
         WebSettings webSettings = mWebView.getSettings();       
         webSettings.setJavaScriptEnabled(true); 
         mWebView.setWebViewClient(new MyWebViewClient());       
         mWebView.getSettings().setBuiltInZoomControls(true);

         assMan = getActivity().getAssets();
         try {
             pageList = assMan.list(path);
         } catch (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         pageIndex = listPosition;
         pagePath=pageList[pageIndex];

         mWebView.loadUrl("file:///android_asset/s_english/contents/" + pagePath);
             //mWebView.loadUrl("http://192.168.0.33:8080/orginalsource/contents/" + pagePath);
            //MultiplePageScroll.mSpinner.setVisibility(View.GONE);

         return view;  
     }  

     @Override
     public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
         outState.putBoolean("dummy", true);
     }


    private class MyWebViewClient extends WebViewClient {

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
        }

    }

}  

activity_multiple_page_scroll.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <com.example.multiplepages.InfiniteViewPager
        android:id="@+id/pager"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</LinearLayout>

您可以使用 sharedPrefernce 来保存已启动的页面并使用它。通过稍微修改此代码,您可以实现您想要的。

于 2013-08-21T06:45:19.757 回答