想实现一个图片水平滚动的效果

JPF1024 2015-08-21 10:11:03
有点像网易或者凤凰那种查看新闻多张图的实现效果,通过滑动从网络加载下一张或者上一张图片,写了很久发现还是有问题,在线求解。。坐等大神。

图片加载不报错,但是就是没有显示图片,网络请求也是发送出去了的。这里用的是volley请求网络.

图片加载的Fragment:


import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.view.PagerAdapter;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;


/**
* 图-Fragment.
* <p>
* Created by puruidong on 8/15/15.
*/
public class SimgFragment extends LazyFragment {


protected static final String TAG = "MainActivity";
private String[] mImgIds;
private MyJazzyViewPager mViewPager;
private Context context;
private DateUtils dateutils = DateUtils.getInstance();


public SimgFragment(Context context) {
this.context = context;
}

// 标志位,标志已经初始化完成。
private boolean isPrepared;
private View view;
private ImageView imageView;
private View simgMainView ;


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

if (view == null) {
view = inflater.inflate(R.layout.simg_fragment, null);
}
if(simgMainView==null){
simgMainView = inflater.inflate(R.layout.simg_main,null);
}
// 缓存的rootView需要判断是否已经被加过parent,如果有parent需要从parent删除,要不然会发生这个rootview已经有parent的错误。
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null) {
parent.removeView(view);
parent.removeView(simgMainView);
}
Log.i("IMAGE", "22222222222222222222222222222222222222222222******images");
return view;
}


@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mImgIds = new String[]{
"http://a.hiphotos.baidu.com/image/pic/item/3bf33a87e950352ad6465dad5143fbf2b2118b6b.jpg",
"http://a.hiphotos.baidu.com/image/pic/item/c8177f3e6709c93d002077529d3df8dcd0005440.jpg",
"http://f.hiphotos.baidu.com/image/pic/item/7aec54e736d12f2ecc3d90f84dc2d56285356869.jpg",
"http://e.hiphotos.baidu.com/image/pic/item/9c16fdfaaf51f3de308a87fc96eef01f3a297969.jpg",
"http://d.hiphotos.baidu.com/image/pic/item/f31fbe096b63f624b88f7e8e8544ebf81b4ca369.jpg",
"http://h.hiphotos.baidu.com/image/pic/item/11385343fbf2b2117c2dc3c3c88065380cd78e38.jpg",
"http://c.hiphotos.baidu.com/image/pic/item/3801213fb80e7bec5ed8456c2d2eb9389b506b38.jpg"
};
System.out.println("2222222222222222222222222222222222222222222222222"+Arrays.toString(mImgIds));

mViewPager = (MyJazzyViewPager) view.findViewById(R.id.id_viewPager);
mViewPager.setAdapter(new PagerAdapter() {

@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}

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

@Override
public Object instantiateItem(ViewGroup container, int position) {
NetworkUtils network = new NetworkUtils(context);
/*

在下面这个方法里面请求网络图片,是传递一个ImageView过去然后直接将图片设置在ImageView上面的
,因为之前用ImageView加载一张图都是好用的,不知道为啥用ViewPager就不行了.





*/
ImageView imageView = (ImageView) network.getImageByImageLoader(mImgIds[position], simgMainView, R.id.simg);
container.addView(imageView);
mViewPager.setObjectForPosition(imageView, position);
Log.i("IMAGE", "111111111111111111111111111111111111111111111111111111111111111111111111111111111111******images");
return imageView;
}

@Override
public int getCount() {
return mImgIds.length;
}
});


Log.i("IMAGE", "5555555555555555555555555******images");
imageView = (ImageView) view.findViewById(R.id.simg);
isPrepared = true;
lazyLoad();
}

@Override
protected void lazyLoad() {
if (!isPrepared || !isVisible) {
return;
}
}

}


网络请求图片加载的方法:


下面是封装的加载图片的方法,在这个例子里面用的第一个方法:






//在这个例子里面用的是这个方法!!!!!!
/**
* 通过ImageLoader加载并设置网络图片
*
* @param url 图片url
* @param view 图片控件所在的View对象
* @param imgViewId ImageView或其它图片展示控件的Id
*/
public View getImageByImageLoader(String url,View view,int imgViewId){
if (!isOnline()) {
showToast("目前无法访问网络,请稍候在试",R.mipmap.toast_info,Toast.LENGTH_SHORT);
}
ImageLoader loader = new ImageLoader(queue,new BitmapCache());
ImageView imageView = (ImageView) view.findViewById(imgViewId);
ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView, R.mipmap.image_loading,R.mipmap.image_loader_error);
loader.get(url,listener);
return imageView;
}

//在这个例子里面用的上面是这个方法!!!!!!

/**
* 通过ImageRequest加载并设置网络图片
*
* @param url 图片url
* @param view 图片控件所在的View对象
* @param imgViewId ImageView或其它图片展示控件的Id
*/
public void getImageByImageRequest(String url, final View view, final int imgViewId){
if (!isOnline()) {
showToast("目前无法访问网络,请稍候在试",R.mipmap.toast_info,Toast.LENGTH_SHORT);
}
ImageRequest request = new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
//显示加载成功的图片.
ImageView img = (ImageView) view.findViewById(imgViewId);
img.setImageBitmap(response);
}
}, 0, 0, ImageView.ScaleType.CENTER_INSIDE, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//显示加载失败的图片.
ImageView img = (ImageView) view.findViewById(imgViewId);
img.setImageResource(R.mipmap.image_loader_error);
}
});

}

/**
* 通过NetworkImageView加载并设置网络图片
*
* @param url 图片url
* @param view 图片控件所在的View对象activit
* @param netWorkImgViewId ImageView或其它图片展示控件的Id
*/
public void getImageByNetworkImageView(String url, final View view, final int netWorkImgViewId){
if (!isOnline()) {
showToast("目前无法访问网络,请稍候在试",R.mipmap.toast_info,Toast.LENGTH_SHORT);
}
ImageLoader loader = new ImageLoader(queue,new BitmapCache());
NetworkImageView networkImageView = (NetworkImageView) view.findViewById(netWorkImgViewId);
networkImageView.setDefaultImageResId(R.mipmap.image_loading);
networkImageView.setErrorImageResId(R.mipmap.image_loader_error);
networkImageView.setImageUrl(url,loader);
}





布局文件:



viewpager的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<com.demo.view.MyJazzyViewPager xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/id_viewPager"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</com.demo.view.MyJazzyViewPager>



里面内容项的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:id="@+id/simgmain"
android:layout_width="match_parent"
android:layout_height="match_parent"
>

<ImageView
android:id="@+id/simg"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="fitXY"
/>

</LinearLayout>



有一个重写的ViewPager类,代码贴不下了。。
...全文
210 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
JPF1024 2015-08-23
  • 打赏
  • 举报
回复
谢谢群里一个朋友的提醒,困扰了好几天,真心感谢。 下面是解决方案: 更改后的整体思路: 1.从RadioButton打开Fragment1(就是最外层的Fragment); 2.在Fragment里面加载一个ViewPager(布局文件里面只有一个ViewPager); 3.给ViewPager设置一个FragmentAdapter的实现类; 4.在FragmentAdapter的实现类的getItem方法里面调用另外一个Fragment(专门用于展示图片,布局文件里面只有一个ImageView); 5.在ImageFragment(用于展示图片的Fragment)里面进行请求网络加载图片数据. 设置ViewPager:

 mViewPager = (android.support.v4.view.ViewPager) view.findViewById(R.id.id_viewPager);
 mViewPager.setAdapter(new CustomFragmentPagerAdapter(getFragmentManager()));
FragmentPagerAdapter的实现类:

lass CustomFragmentPagerAdapter extends FragmentPagerAdapter{

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

        /**
             * Return the Fragment associated with a specified position.
             *
             * @param position
             */
            @Override
            public Fragment getItem(int position) {
                ImageFragment _img = new ImageFragment();
                /*mImgIds是一个URL数组*/
                _img.setImageUrl(mImgIds[position]);
                return _img;
            }

            @Override
            public int getCount() {
                return Integer.MAX_VALUE;
            }
    }
ImageFragment[用于展示Image]:

/**
 * Created by puruidong on 8/22/15.
 */
public class ImageFragment  extends LazyFragment {

    private View view;
    // 标志位,标志已经初始化完成。
    private boolean isPrepared;
    private ImageView imageView;

    public String getImageUrl() {
        return imageUrl;
    }

    public void setImageUrl(String imageUrl) {
        this.imageUrl = imageUrl;
    }

    private String imageUrl ;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if(view==null){
            view = inflater.inflate(R.layout.simg_main,null);
        }
        if(imageView==null){
            imageView = (ImageView) view.findViewById(R.id.simg);
        }
        isPrepared = true;
        lazyLoad();
        return view;
    }

    @Override
    protected void lazyLoad() {

        if (!isPrepared || !isVisible) {
            return;
        }
        if(TextUtils.isEmpty(imageUrl)){
            return ;
        }
        
        //下面这个地方主要使用了Volley的进行获取相关图片,就不贴了.
        //可以自行使用各网络库加载图片即可.
        NetworkUtils network = new NetworkUtils(this.getActivity());
        network.getImageByImageRequest(imageUrl, new NetworkUtils.onImageLoaderListener() {

            @Override
            public void onSuccessImage(Bitmap bitmap) {
                Log.i("IMAGE", (bitmap == null) + "bitmap==null9999999999999999999999999999999999******" );
                imageView.setImageBitmap(bitmap);
                Log.i("IMAGE", "00000000000000000000000000000000000000000000000000000000******images");
            }
        });
        //上面是加载网络图片.
    }
}
LazyFragment的代码:

import android.support.v4.app.Fragment;
import android.view.View;

/**
 *
 * Fragment数据的缓加载.
 *
 *
 * #{link http://blog.csdn.net/maosidiaoxian/article/details/38300627}
 *
 * Created by puruidong on 8/16/15.
 */
public abstract class LazyFragment extends Fragment {
    protected boolean isVisible;

    @Override
    public void setMenuVisibility(boolean menuVisible) {
        super.setMenuVisibility(menuVisible);
        if (this.getView() != null)
            this.getView().setVisibility(menuVisible ? View.VISIBLE : View.GONE);
    }

    /**
     * 在这里实现Fragment数据的缓加载.
     *
     * @param isVisibleToUser
     */
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (getUserVisibleHint()) {
            isVisible = true;
            onVisible();
        } else {
            isVisible = false;
            onInvisible();
        }
    }

    protected void onVisible() {
        lazyLoad();
    }

    protected abstract void lazyLoad();

    protected void onInvisible() {
    }
}
JPF1024 2015-08-21
  • 打赏
  • 举报
回复
整个应用大致如下:

80,472

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧