【问题标题】:NotifyDataSetChanged is not refreshing the ViewPagerNotifyDataSetChanged 不刷新 ViewPager
【发布时间】:2015-07-31 13:41:32
【问题描述】:

我正在研究 ViewPager 概念。在 ViewPager item cell 中包含 ImageView 和 TextView 两个 item。

最初,我将下载模糊图像并在 ViewPager 单元格中显示。完成后,我将下载高分辨率图像并分别显示在 ViewPager 单元格中。

例如,如果我将 ViewPager 中的第一个项目视为模糊图像,并且在后台它正在下载高分辨率图像,那么它必须刷新 ViewPager 并在相应的视图单元格中显示高分辨率图像。

刷完两个项目,然后回到第一个项目,此时它显示高分辨率图像。

所以我的问题是没有向左或向右滑动,如果当前视图发生任何变化,我需要刷新当前视图。

ViewPager 活动类:

public class ViewPagerActivity extends Activity {
ViewPager pager;
String[] _blurImageURL;

PagerAdapter _pagerAdapter;
Context _context;

ViewPagerModel vpModel = new ViewPagerModel();

ArrayList<String> lstQueue=new ArrayList<String>();
Handler _handler=new Handler();


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_view_pager);
    pager = (ViewPager) findViewById(R.id.pagerView);
    _context = this;

    _blurImageURL = new String[]{

            "http://cdn.connollyphoto.nyc/wp-content/uploads/2014/06/cp_seanbell_portrait_002-800x1200.jpg",
            "http://static.wixstatic.com/media/e6f301_7d57a9c0ebdf4d438f88633637aaed77.jpg_srz_930_1395_85_22_0.50_1.20_0.00_jpg_srz",
            "http://a4.format-assets.com/image/private/s--TmkImGBO--/c_limit,g_center,h_1200,w_65535/a_auto,fl_keep_iptc.progressive,q_95/31336-7293530-portrait-1_jpg2.jpg",
            "http://daviddodgephotography.com/wp-content/uploads/2015/03/Donna_12.jpg",
            "http://a3.format-assets.com/image/private/s--W9Flct-g--/c_limit,g_center,h_1200,w_65535/a_auto,fl_keep_iptc.progressive,q_95/173355-8951465-Marvin_Portraits-005.jpg",
            "http://www.leifnorman.net/wp-content/uploads/2014/10/IMG_6070.jpg",
            "https://dwaynefoong.files.wordpress.com/2012/05/amin-fashion-portrait-dwayne-foong-photography.jpg",
            "https://m1.behance.net/rendition/modules/117495331/hd/ce856c4a1fb4c09a5ecec05839f6ddc4.jpg",
            "http://www.pcimagenetwork.com/perks/Perks%202013.jpg",
    };


    _pagerAdapter = new ViewPagerAdapter(_context, vpModel, this);
    pager.setAdapter(_pagerAdapter);

    // Calling Volley Library to Download the Image for each URLi

    for (int i = 0; i < _blurImageURL.length; i++) {
        String fileName = String.valueOf(i);
        fileName=fileName+"_blurImg";

        DownloadImages(_blurImageURL[i], fileName, true);
    }


}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.view_pager, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

public void updateView() {
    _pagerAdapter.notifyDataSetChanged();
}
 public void DownloadQueue(String url_in,String fileName_in)
 {
     if(lstQueue.contains(fileName_in))
     {
         Log.i("Duplicate_Request=",fileName_in);
     }
     else{
         lstQueue.add(fileName_in);
         DownloadImages(url_in,fileName_in,false);
     }

 }

void DownloadImages(String imageURL_in, final String fileName_in, final boolean isBlur_in) {
    ImageRequest imageRequest = new ImageRequest(imageURL_in,
            new Response.Listener<Bitmap>() {

                @Override
                public void onResponse(final Bitmap response) {
                    try {
                        Log.v("Response_Received =",fileName_in);
                        // Saved in SD Card and getting the Path
                        String imagePath = SavedInSDCard(response,fileName_in);

                        //updating the Model
                        if (isBlur_in) {
                            vpModel.blurImgLocalPath.add(imagePath);

                        } else {
                            vpModel.highResolutionImgLocalPath.add(imagePath);
                        }

                          //updating the View
                        _handler.post(new Runnable() {
                            @Override
                            public void run () {
                                updateView();
                            }
                        });  


                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }, 0, 0, null, null);
    ApplicationController.getInstance().addToRequestQueue(imageRequest);

}

public String SavedInSDCard(Bitmap bitmap, String fileName_in) {

    File dir = new File(ApplicationController.getAppContext()
            .getExternalFilesDir("ViewPager_POC") + "/Cache");
    // Create the storage directory if it does not exist
    if (!dir.exists()) {
        dir.mkdirs();
    }
    File file = new File(dir, fileName_in);
    try {
        FileOutputStream out = new FileOutputStream(file);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 70, out);
        out.flush();
        out.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    String imgPath = dir + "/" + fileName_in;
    return imgPath;
}


}

ViewPager 适配器类:

public class ViewPagerAdapter extends PagerAdapter {
Context _context;
LayoutInflater inflater;
ViewPagerActivity _vpActivity;

String[] _highResolutionURL = new String[]{
        "http://www.monportraitpro.fr/wp-content/uploads/2014/08/Philippe-Vasilescu.jpg",
        "http://www.markhicksphotography.com/wp-content/uploads/2012/01/MHP2012_01_04_MHP_DSC0003.jpg",
        "http://www.andrew-mason.com/wp-content/uploads/2013/05/portrait-1-3.jpg",
        "http://shutterfinger.typepad.com/.a/6a00e551a6244a8833019affd0eb14970d-pi",
        "http://www.antonioolmos.com/data/photos/90_1childs_livebooks.jpg",
        "http://www.dvdsreleasedates.com/pictures/800/12000/Zachary-Quinto.jpg",
        "http://www.glnphotography.com/wp-content/uploads/2013/09/IMG_1347.jpg",
        "http://www.dvdsreleasedates.com/pictures/800/12000/Paul-Walker.jpg",
        "http://www.antonioolmos.com/data/photos/89_1blairbooks.jpg",
};

ArrayList<String> _blurImgPath;
ArrayList<String> _highResolutionImgPath;

public ViewPagerAdapter(Context context_in, ViewPagerModel vpModel_in, ViewPagerActivity activity_in) {
    _context = context_in;
    _blurImgPath = vpModel_in.blurImgLocalPath;
    _highResolutionImgPath = vpModel_in.highResolutionImgLocalPath;
    _vpActivity = activity_in;

}

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

@Override
public void destroyItem(View container, int position, Object object) {
    // TODO Auto-generated method stub
    ((ViewPager) container).removeView((View) object);
}

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

    // Declare Variables
    TextView txtCounter;
    final ImageView imgView;

    inflater = (LayoutInflater) _context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View itemView = inflater.inflate(R.layout.view_pager_item, container,
            false);

    txtCounter = (TextView) itemView.findViewById(R.id.counter);


    imgView = (ImageView) itemView.findViewById(R.id.images);

    //Setting the values for Image and textview
    txtCounter.setText("" + (position + 1));

    //Setting the Image
    if (position < _highResolutionImgPath.size()) {
        //Setting Hi-ResImage
        Log.v("HighRes_ImgPath=", "Get Image from Model" );
        imgView.setImageBitmap(BitmapFactory.decodeFile(_highResolutionImgPath.get(position)));
    } else {
        // Generating the request for HighResolution Image
        String fileName = String.valueOf(position + 10);
        fileName = fileName + "_clearImg";

        Log.v("HighRes_ImgPath=", "Sending Request to Queue=" + fileName);
        _vpActivity.DownloadQueue(_highResolutionURL[position], fileName);
        //Setting the BlurImage
        imgView.setImageBitmap(BitmapFactory.decodeFile(_blurImgPath.get(position)));

    }


    // Add viewpager_item.xml to ViewPager
    ((ViewPager) container).addView(itemView);

    return itemView;
}

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

}

ViewPager 模型:

public class ViewPagerModel {

ArrayList<String> blurImgLocalPath=new ArrayList<String>();
ArrayList<String> highResolutionImgLocalPath=new ArrayList<String>();
}

activity_view_pager.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.poc_viewpager.ViewPagerActivity" >

 <android.support.v4.view.ViewPager
    android:id="@+id/pagerView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
      />

/>

view_pager_item.xml:

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

<ImageView
    android:id="@+id/images"
    android:layout_width="match_parent"
    android:layout_height="400dp"
    android:layout_alignParentLeft="true" />

<TextView
    android:id="@+id/counter"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Large Text"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="43dp" />


</RelativeLayout>

【问题讨论】:

    标签: android android-viewpager notifydatasetchanged


    【解决方案1】:

    在这种情况下,我会使用Picasso

    例如:

    Picasso.with(getActivity())
                            .load(URL_THUMBNAIL) // thumbnail url goes here
    
                            .into(IMAGEVIEW, new Callback() { // Your image view
    
                                // On success start loading the full resolution image
                                @Override
                                public void onSuccess() {       
    
                                    Picasso.with(getActivity())
    
                                            .load(FULL_RESOLUTION_URL) // image url goes here
                                            .into(IMAGEVIEW);
                                }
    
                                @Override
                                public void onError() {
                                    // Manage downloading errors here
                                }
                            });
    

    【讨论】:

      【解决方案2】:

      updateView() 在后台线程上被调用。 notifyDataSetChanged() 在后台线程上不起作用。在 UI 线程上调用 notifyDataSetChanged() 方法应该可以解决您的问题

      【讨论】:

      • 感谢@Alim Parker 的建议。但这对我不起作用。静止视图未更新。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多