ImageView最初没有显示图像(ImageView not showing image initially)
我有GridView显示几个图像和一个与TouchImageView集成的ViewPager。 除了一种情况外,似乎工作正常。
当您单击任何GridView的缩略图图像以启动ViewPager时,response.getBitMap将显示为NULL。 但是当我们继续向右滑动时,图像加载正常。 当我们向后滑动时,甚至会显示第一张图像。 每次从GridViewActivity点击GridView的缩略图时,都会发生这种情况。
在检查日志文件后,我可以看到ImageLoader一次请求2个图像(当前和下一个图像)但是对于初始加载它执行相同的操作两次(所以总共4个请求,检查下面的logcat)。
FullScreenImageAdapter.java代码:
import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.RelativeLayout; import com.android.volley.VolleyError; import com.android.volley.toolbox.ImageLoader; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; public class FullScreenImageAdapter extends PagerAdapter { //Log tag private static final String TAG = FullImageActivity.class.getSimpleName(); private Activity _activity; private String[] _imagePaths, _imageCaptions; private LayoutInflater inflater; private View mCurrentView; TouchImageView imgDisplay; // constructor public FullScreenImageAdapter(Activity activity, String[] imagePaths, String[] imageCaptions) { this._activity = activity; this._imagePaths = imagePaths; this._imageCaptions = imageCaptions; } @Override public int getCount() { return this._imagePaths.length; } @Override public boolean isViewFromObject(View view, Object object) { return view == ((RelativeLayout) object); } public String getImageCaption(int position) { return _imageCaptions[position]; } @Override public void setPrimaryItem(ViewGroup container, int position, Object object) { mCurrentView = (View)object; } public View getCurrentView() { return mCurrentView; } @Override public Object instantiateItem(ViewGroup container, int position) { inflater = (LayoutInflater) _activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View viewLayout = inflater.inflate(R.layout.layout_fullscreen_image, container, false); imgDisplay = (TouchImageView) viewLayout.findViewById(R.id.imgDisplay); // We download image into ImageView ImageLoader imageLoader = AppController.getInstance().getImageLoader(); String strFullImageURL = _imagePaths[position]; imageLoader.get(strFullImageURL, new ImageLoader.ImageListener() { @Override public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) { Log.d(TAG, "Outside IF response.getBitmap() = "+response.getBitmap()+""); if (response.getBitmap() != null) { Log.d(TAG, "Inside IF response.getBitmap() = "+response.getBitmap()+""); // load bitmap into imageview imgDisplay.setImageBitmap(response.getBitmap()); } } @Override public void onErrorResponse(VolleyError error) { // unable to fetch full image Log.d(TAG, "VolleyError while downloading full image: "+error.getMessage()); } }); ((ViewPager) container).addView(viewLayout); return viewLayout; } @Override public void destroyItem(ViewGroup container, int position, Object object) { ((ViewPager) container).removeView((RelativeLayout) object); } }
logcat的
10-05 18:16:31.286 24976-24976/com.xyz D/GridViewActivity﹕ Array length: 32 10-05 18:16:31.626 24976-24976/com.xyz D/FullImageActivity﹕ Outside IF response.getBitmap() = null 10-05 18:16:32.277 24976-24976/com.xyz D/FullImageActivity﹕ Outside IF response.getBitmap() = android.graphics.Bitmap@42a4f4a0 10-05 18:16:32.277 24976-24976/com.xyz D/FullImageActivity﹕ Inside IF response.getBitmap() = android.graphics.Bitmap@42a4f4a0 10-05 18:16:32.477 24976-24976/com.xyz D/FullImageActivity﹕ Outside IF response.getBitmap() = android.graphics.Bitmap@42a737d0 10-05 18:16:32.477 24976-24976/com.xyz D/FullImageActivity﹕ Inside IF response.getBitmap() = android.graphics.Bitmap@42a737d0
不知道为什么会这样。 我能做些什么来解决它?
I have GridView which displays few images and a ViewPager integrated with TouchImageView. It seems to be working fine except for one scenario.
When you click on any GridView's thumbnail image to initiate the ViewPager, the response.getBitMap is coming up as NULL. But when we keep swiping to right, images are loading fine. Even the first image is displayed when we swipe back to it. It happens everytime when an GridView's thumbnail image is clicked initially from GridViewActivity.
Upon checking the log files, I can see ImageLoader is making request for 2 images at a time (current and the next image) but for initial load it doing the same thing twice (so total 4 requests, check logcat below).
FullScreenImageAdapter.java code:
import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.RelativeLayout; import com.android.volley.VolleyError; import com.android.volley.toolbox.ImageLoader; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; public class FullScreenImageAdapter extends PagerAdapter { //Log tag private static final String TAG = FullImageActivity.class.getSimpleName(); private Activity _activity; private String[] _imagePaths, _imageCaptions; private LayoutInflater inflater; private View mCurrentView; TouchImageView imgDisplay; // constructor public FullScreenImageAdapter(Activity activity, String[] imagePaths, String[] imageCaptions) { this._activity = activity; this._imagePaths = imagePaths; this._imageCaptions = imageCaptions; } @Override public int getCount() { return this._imagePaths.length; } @Override public boolean isViewFromObject(View view, Object object) { return view == ((RelativeLayout) object); } public String getImageCaption(int position) { return _imageCaptions[position]; } @Override public void setPrimaryItem(ViewGroup container, int position, Object object) { mCurrentView = (View)object; } public View getCurrentView() { return mCurrentView; } @Override public Object instantiateItem(ViewGroup container, int position) { inflater = (LayoutInflater) _activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View viewLayout = inflater.inflate(R.layout.layout_fullscreen_image, container, false); imgDisplay = (TouchImageView) viewLayout.findViewById(R.id.imgDisplay); // We download image into ImageView ImageLoader imageLoader = AppController.getInstance().getImageLoader(); String strFullImageURL = _imagePaths[position]; imageLoader.get(strFullImageURL, new ImageLoader.ImageListener() { @Override public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) { Log.d(TAG, "Outside IF response.getBitmap() = "+response.getBitmap()+""); if (response.getBitmap() != null) { Log.d(TAG, "Inside IF response.getBitmap() = "+response.getBitmap()+""); // load bitmap into imageview imgDisplay.setImageBitmap(response.getBitmap()); } } @Override public void onErrorResponse(VolleyError error) { // unable to fetch full image Log.d(TAG, "VolleyError while downloading full image: "+error.getMessage()); } }); ((ViewPager) container).addView(viewLayout); return viewLayout; } @Override public void destroyItem(ViewGroup container, int position, Object object) { ((ViewPager) container).removeView((RelativeLayout) object); } }
Logcat
10-05 18:16:31.286 24976-24976/com.xyz D/GridViewActivity﹕ Array length: 32 10-05 18:16:31.626 24976-24976/com.xyz D/FullImageActivity﹕ Outside IF response.getBitmap() = null 10-05 18:16:32.277 24976-24976/com.xyz D/FullImageActivity﹕ Outside IF response.getBitmap() = android.graphics.Bitmap@42a4f4a0 10-05 18:16:32.277 24976-24976/com.xyz D/FullImageActivity﹕ Inside IF response.getBitmap() = android.graphics.Bitmap@42a4f4a0 10-05 18:16:32.477 24976-24976/com.xyz D/FullImageActivity﹕ Outside IF response.getBitmap() = android.graphics.Bitmap@42a737d0 10-05 18:16:32.477 24976-24976/com.xyz D/FullImageActivity﹕ Inside IF response.getBitmap() = android.graphics.Bitmap@42a737d0
Not sure why this is happening. Anything I could do to fix it?
原文:https://stackoverflow.com/questions/26207887
最满意答案
设置组的布局数据的宽度和高度提示:
GridData data = new GridData(SWT.FILL, SWT.TOP, true, false); data.widthHint = 200; data.heightHint = 200; grpModelProperties1.setLayoutData(data);
要使用
ScrolledComposite
你需要这样的东西:ScrolledComposite scrolledComposite = new ScrolledComposite(composite, SWT.H_SCROLL | SWT.V_SCROLL); // You must set a layout on scrolled composite scrolledComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); scrolledComposite.setExpandHorizontal(true); scrolledComposite.setExpandVertical(true); // Additional inner composite is required Composite innerComposite = new Composite(scrolledComposite, SWT.NONE); innerComposite.setLayout(new GridLayout()); Group grpModelProperties1 = new Group(innerComposite, SWT.SHADOW_IN); grpModelProperties1.setLayout(new GridLayout()); grpModelProperties1.setText("Test Model"); GridData data1 = new GridData(SWT.FILL, SWT.TOP, true, false); data1.heightHint = 400; data1.widthHint = 400; grpModelProperties1.setLayoutData(data1); scrolledComposite.setContent(innerComposite); // No need to use a resize listener scrolledComposite.setMinSize(innerComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
Set the width and height hints for the layout data of the group:
GridData data = new GridData(SWT.FILL, SWT.TOP, true, false); data.widthHint = 200; data.heightHint = 200; grpModelProperties1.setLayoutData(data);
To use
ScrolledComposite
you need something like:ScrolledComposite scrolledComposite = new ScrolledComposite(composite, SWT.H_SCROLL | SWT.V_SCROLL); // You must set a layout on scrolled composite scrolledComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); scrolledComposite.setExpandHorizontal(true); scrolledComposite.setExpandVertical(true); // Additional inner composite is required Composite innerComposite = new Composite(scrolledComposite, SWT.NONE); innerComposite.setLayout(new GridLayout()); Group grpModelProperties1 = new Group(innerComposite, SWT.SHADOW_IN); grpModelProperties1.setLayout(new GridLayout()); grpModelProperties1.setText("Test Model"); GridData data1 = new GridData(SWT.FILL, SWT.TOP, true, false); data1.heightHint = 400; data1.widthHint = 400; grpModelProperties1.setLayoutData(data1); scrolledComposite.setContent(innerComposite); // No need to use a resize listener scrolledComposite.setMinSize(innerComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
相关问答
更多-
设置组的布局数据的宽度和高度提示: GridData data = new GridData(SWT.FILL, SWT.TOP, true, false); data.widthHint = 200; data.heightHint = 200; grpModelProperties1.setLayoutData(data); 要使用ScrolledComposite你需要这样的东西: ScrolledComposite scrolledComposite = new ScrolledComposite ...
-
创建具有特定高度的空表格并在SWT中单击按钮时重绘(Create empty table with specific height and redraw on button click in SWT)[2022-05-06]
SWT中的小部件的大小和位置由布局管理器控制。 因此,您需要指示表格的布局管理器将其赋予所需的高度。 如果表格的父级使用GridLayout ,则可以使用提示来影响布局管理器的大小计算。 parent.setLayout( new GridLayout( 1, false ) ); ... Table table = new Table( parent, SWT.NONE ); GridData gridData = new GridData(); gridData.heightHint = table.g ... -
为组SWT设置固定大小(Set fixed size for group SWT)[2024-02-20]
下面的代码做你想要的。 技巧由两部分组成: 相同宽度 :父级(在本例中是Shell )使用GridLayout ,其中每列具有相同的宽度 同一高度 :我们使用GridData来告诉每个Group占据父级( Shell )的整个高度。 public class StackExample { public static void main(String[] args) { Display display = Display.getDefault(); final ... -
将您的组设置为适合内容。 您的小组正在隐藏您的标签显示。 Set your Group to fit content. Your Group is hiding you label display.
-
有几种方法可以解决此问题。 我认为以下两个最适用于您的用例: 在转换结束之后添加display: none 。 添加max-height: 100vh和overflow: hidden到非活动部分。 看过你的源代码然而,我建议你完全放弃这些,并使用CSS / JS来运行它。 一个简单的片段,如下所示: window.addEventListener('hashchange', function () { var chash = location.hash $('main section').re ...
-
SWT桌有固定高度(SWT table with fixed height)[2023-03-23]
如果您不希望Table填满可用的垂直空间,请告诉GridData不要这样做: GridData gd_table = new GridData(SWT.FILL, SWT.TOP, true, false, 2, 1); 应该这样做。 至于滚动条,只需将SWT.V_SCROLL添加到Table的样式即可。 If you don't want the Table to fill up the available vertical space, then tell the GridData not to do ... -
你不能使用list.getBorderWidth()和list.getItemHeight()来获取高度吗? Can't you use list.getBorderWidth() and list.getItemHeight() to get the height?
-
这实际上是Windows限制。 复合材料在窗口中可能只有一定的大小,不超过32767(像素,我假设)。 这是找到的scrolledComposite,因为它实际上不是> 32767,它似乎是。 而对于mainComp,实际大小> 32767,这是我们被切断的地方。 最初我认为这是一个Eclipse错误并提交了一份报告,我被告知这是一个Windows问题/功能: https : //bugs.eclipse.org/bugs/show_bug.cgi?id = 333111 This is actually ...
-
bla.. bla..
bla.. bla..
-
尝试将它们设置为最大高度: $(document).ready(function() { var maxHeight = 0; $("#cat_product_list #cat_list").each(function() { if ($(this).outerHeight() > maxHeight) { maxHeight = $(this).outerHeight(); } }).height(maxHeight); }); 更新22/09/16 :您也可以 ...