63145

How to load dynamic images in custom ListView

Question:

How to load dynamic images in custom ListView iI follow this tutorial to show ListView in horizontal <a href="http://www.dev-smart.com/archives/34" rel="nofollow">http://www.dev-smart.com/archives/34</a> but the problem is this example used same sample icon,but I want to use dynamic images which I get from resource or web parsing

<strong>HorizontalListViewDemo.java :</strong>

public class HorizontalListViewDemo extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listviewdemo); HorizontialListView listview = (HorizontialListView) findViewById(R.id.listview); listview.setAdapter(mAdapter); } private static String[] dataObjects = new String[]{ "Text #1", "Text #2", "Text #3" }; private BaseAdapter mAdapter = new BaseAdapter() { @Override public int getCount() { return dataObjects.length; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { View retval = LayoutInflater.from(parent.getContext()).inflate(R.layout.viewitem, null); TextView title = (TextView) retval.findViewById(R.id.title); title.setText(dataObjects[position]); return retval; } }; }

<strong>Layout file :</strong>

<linearlayout xmlns:android="http://schemas.android.com/apk/res /android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#fff"> <com.devsmart.android.ui.horizontiallistview android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#ddd"> </com.devsmart.android.ui.horizontiallistview> </linearlayout> <linearlayout xmlns:android="http://schemas.android.com /apk/res/android" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#fff"> <imageview android:id="@+id/image" android:layout_width="150dip" android:layout_height="150dip" android:scaletype="centerCrop" android:src="@drawable/icon"> <textview android:id="@+id/title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textcolor="#000" android:gravity="center_horizontal"> </textview></imageview></linearlayout>

<strong>HorizontalListView.java</strong>

public class HorizontalListView extends AdapterView<ListAdapter> { public boolean mAlwaysOverrideTouch = true; protected ListAdapter mAdapter; private int mLeftViewIndex = -1; private int mRightViewIndex = 0; protected int mCurrentX; protected int mNextX; private int mMaxX = Integer.MAX_VALUE; private int mDisplayOffset = 0; protected Scroller mScroller; private GestureDetector mGesture; private Queue<View> mRemovedViewQueue = new LinkedList<View>(); private OnItemSelectedListener mOnItemSelected; private OnItemClickListener mOnItemClicked; private OnItemLongClickListener mOnItemLongClicked; private boolean mDataChanged = false; public HorizontalListView(Context context, AttributeSet attrs) { super(context, attrs); initView(); } private synchronized void initView() { mLeftViewIndex = -1; mRightViewIndex = 0; mDisplayOffset = 0; mCurrentX = 0; mNextX = 0; mMaxX = Integer.MAX_VALUE; mScroller = new Scroller(getContext()); mGesture = new GestureDetector(getContext(), mOnGesture); } @Override public void setOnItemSelectedListener(AdapterView.OnItemSelectedListener listener) { mOnItemSelected = listener; } @Override public void setOnItemClickListener(AdapterView.OnItemClickListener listener){ mOnItemClicked = listener; } @Override public void setOnItemLongClickListener(AdapterView.OnItemLongClickListener listener) { mOnItemLongClicked = listener; } private DataSetObserver mDataObserver = new DataSetObserver() { @Override public void onChanged() { synchronized(HorizontalListView.this){ mDataChanged = true; } invalidate(); requestLayout(); } @Override public void onInvalidated() { reset(); invalidate(); requestLayout(); } }; @Override public ListAdapter getAdapter() { return mAdapter; } @Override public View getSelectedView() { //TODO: implement return null; } @Override public void setAdapter(ListAdapter adapter) { if(mAdapter != null) { mAdapter.unregisterDataSetObserver(mDataObserver); } mAdapter = adapter; mAdapter.registerDataSetObserver(mDataObserver); reset(); } private synchronized void reset(){ initView(); removeAllViewsInLayout(); requestLayout(); } @Override public void setSelection(int position) { //TODO: implement } private void addAndMeasureChild(final View child, int viewPos) { LayoutParams params = child.getLayoutParams(); if(params == null) { params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); } addViewInLayout(child, viewPos, params, true); child.measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST)); } @Override protected synchronized void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); if(mAdapter == null){ return; } if(mDataChanged){ int oldCurrentX = mCurrentX; initView(); removeAllViewsInLayout(); mNextX = oldCurrentX; mDataChanged = false; } if(mScroller.computeScrollOffset()){ int scrollx = mScroller.getCurrX(); mNextX = scrollx; } if(mNextX <= 0){ mNextX = 0; mScroller.forceFinished(true); } if(mNextX >= mMaxX) { mNextX = mMaxX; mScroller.forceFinished(true); } int dx = mCurrentX - mNextX; removeNonVisibleItems(dx); fillList(dx); positionItems(dx); mCurrentX = mNextX; if(!mScroller.isFinished()){ post(new Runnable(){ @Override public void run() { requestLayout(); } }); } } private void fillList(final int dx) { int edge = 0; View child = getChildAt(getChildCount()-1); if(child != null) { edge = child.getRight(); } fillListRight(edge, dx); edge = 0; child = getChildAt(0); if(child != null) { edge = child.getLeft(); } fillListLeft(edge, dx); } private void fillListRight(int rightEdge, final int dx) { while(rightEdge + dx < getWidth() && mRightViewIndex < mAdapter.getCount()) { View child = mAdapter.getView(mRightViewIndex, mRemovedViewQueue.poll(), this); addAndMeasureChild(child, -1); rightEdge += child.getMeasuredWidth(); if(mRightViewIndex == mAdapter.getCount()-1) { mMaxX = mCurrentX + rightEdge - getWidth(); } if (mMaxX < 0) { mMaxX = 0; } mRightViewIndex++; } } private void fillListLeft(int leftEdge, final int dx) { while(leftEdge + dx > 0 && mLeftViewIndex >= 0) { View child = mAdapter.getView(mLeftViewIndex, mRemovedViewQueue.poll(), this); addAndMeasureChild(child, 0); leftEdge -= child.getMeasuredWidth(); mLeftViewIndex--; mDisplayOffset -= child.getMeasuredWidth(); } } private void removeNonVisibleItems(final int dx) { View child = getChildAt(0); while(child != null && child.getRight() + dx <= 0) { mDisplayOffset += child.getMeasuredWidth(); mRemovedViewQueue.offer(child); removeViewInLayout(child); mLeftViewIndex++; child = getChildAt(0); } child = getChildAt(getChildCount()-1); while(child != null && child.getLeft() + dx >= getWidth()) { mRemovedViewQueue.offer(child); removeViewInLayout(child); mRightViewIndex--; child = getChildAt(getChildCount()-1); } } private void positionItems(final int dx) { if(getChildCount() > 0){ mDisplayOffset += dx; int left = mDisplayOffset; for(int i=0;i<getChildCount();i++){ View child = getChildAt(i); int childWidth = child.getMeasuredWidth(); child.layout(left, 0, left + childWidth, child.getMeasuredHeight()); left += childWidth + child.getPaddingRight(); } } } public synchronized void scrollTo(int x) { mScroller.startScroll(mNextX, 0, x - mNextX, 0); requestLayout(); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { boolean handled = super.dispatchTouchEvent(ev); handled |= mGesture.onTouchEvent(ev); return handled; } protected boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { synchronized(HorizontalListView.this){ mScroller.fling(mNextX, 0, (int)-velocityX, 0, 0, mMaxX, 0, 0); } requestLayout(); return true; } protected boolean onDown(MotionEvent e) { mScroller.forceFinished(true); return true; } private OnGestureListener mOnGesture = new GestureDetector.SimpleOnGestureListener() { @Override public boolean onDown(MotionEvent e) { return HorizontalListView.this.onDown(e); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return HorizontalListView.this.onFling(e1, e2, velocityX, velocityY); } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { synchronized(HorizontalListView.this){ mNextX += (int)distanceX; } requestLayout(); return true; } @Override public boolean onSingleTapConfirmed(MotionEvent e) { for(int i=0;i<getChildCount();i++){ View child = getChildAt(i); if (isEventWithinView(e, child)) { if(mOnItemClicked != null){ mOnItemClicked.onItemClick(HorizontalListView.this, child, mLeftViewIndex + 1 + i, mAdapter.getItemId( mLeftViewIndex + 1 + i )); } if(mOnItemSelected != null){ mOnItemSelected.onItemSelected(HorizontalListView.this, child, mLeftViewIndex + 1 + i, mAdapter.getItemId( mLeftViewIndex + 1 + i )); } break; } } return true; } @Override public void onLongPress(MotionEvent e) { int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { View child = getChildAt(i); if (isEventWithinView(e, child)) { if (mOnItemLongClicked != null) { mOnItemLongClicked.onItemLongClick(HorizontalListView.this, child, mLeftViewIndex + 1 + i, mAdapter.getItemId(mLeftViewIndex + 1 + i)); } break; } } } private boolean isEventWithinView(MotionEvent e, View child) { Rect viewRect = new Rect(); int[] childPosition = new int[2]; child.getLocationOnScreen(childPosition); int left = childPosition[0]; int right = left + child.getWidth(); int top = childPosition[1]; int bottom = top + child.getHeight(); viewRect.set(left, top, right, bottom); return viewRect.contains((int) e.getRawX(), (int) e.getRawY()); } }; }

Answer1:

Take a look at the link below. Someone already have written a library for it.

<a href="https://github.com/nostra13/Android-Universal-Image-Loader" rel="nofollow">Android Universal Image Loader</a>

I used <a href="https://github.com/koush/UrlImageViewHelper" rel="nofollow">this</a> library in my recent projects and it worked flawlessly.

Hope it will help.

Answer2:

Here are those what you are looking for..

<ul><li><a href="http://iamvijayakumar.blogspot.com/2011/06/android-lazy-image-loader-example.html" rel="nofollow">Android-lazy-image-loader-example.html</a></li> <li><a href="http://ballardhack.wordpress.com/2010/04/05/loading-remote-images-in-a-listview-on-android/" rel="nofollow">Loading-remote-images-in-a-listview-on-android/</a></li> </ul>

Answer3:

As @Varundroid said you can make use of Android universal image loader, which works awesomely good. But that is a huge library for such a small purpose. You may consider writing your own <a href="http://javatechig.com/android/asynchronous-image-loader-in-android-listview/" rel="nofollow">Asynchronous Image Loader for Android ListView</a>

You can change the following in your adapter class

public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = layoutInflater.inflate(R.layout.list_row_layout, null); holder = new ViewHolder(); holder.imageView = (ImageView) convertView.findViewById(R.id.thumbImage); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } NewsItem newsItem = (NewsItem) listData.get(position); if (holder.imageView != null) { new ImageDownloaderTask(holder.imageView).execute(newsItem.getUrl()); } return convertView; }

<strong>For Downloading image in separate thread</strong>

class ImageDownloaderTask extends AsyncTask<String, Void, Bitmap> { private final WeakReference imageViewReference; public ImageDownloaderTask(ImageView imageView) { imageViewReference = new WeakReference(imageView); } @Override // Actual download method, run in the task thread protected Bitmap doInBackground(String... params) { // params comes from the execute() call: params[0] is the url. return downloadBitmap(params[0]); } @Override // Once the image is downloaded, associates it to the imageView protected void onPostExecute(Bitmap bitmap) { if (isCancelled()) { bitmap = null; } if (imageViewReference != null) { ImageView imageView = imageViewReference.get(); if (imageView != null) { if (bitmap != null) { imageView.setImageBitmap(bitmap); } else { imageView.setImageDrawable(imageView.getContext().getResources() .getDrawable(R.drawable.list_placeholder)); } } } } }

The above link has the complete tutorial for your purpose.

Recommend

  • Migration steps from Material UI v0.x to v1.y
  • Question about C datatype and constant
  • IgnoreReadOnlyRecommended not working from Python when opening Excel workbook
  • Is DatePickerCtrl been update to work with Python 3.4, wxPython_Phoenix 3.0.3 and Windows 7
  • 剑指offer43:左旋转字符串(字符串):对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。
  • Remove duplicate trailing slashes
  • Error logging in c++
  • How can I build a custom model binder which will return different types of models depending on the r
  • Container of Different Functors
  • Find every third value and insert cr or newline in VIM
  • Socket issue when using threads
  • stacktrace.log file is too large
  • How to extract attributes values from svyciprop object?
  • Performance problem with read and parse large XML files
  • Missing Reporting Server templates in Visual Studio 2013 + Business Intelligence SSDT
  • Relative paths using requirejs in combination with Typescript and AMD
  • DataKinds and type class instances
  • Castle Windsor: Will my transient component be garbage collected?
  • PHP: If a equals b or c or d [duplicate]
  • ERROR Android emulator gets killed
  • Comparing python dictionaries and find diffrence of the two
  • Modified event of FileSystemWatcher getting triggered multiple times [duplicate]
  • How to set fixed size of cropped images in Android?
  • Vue router and webpack - history mode config localhost
  • “*Certificate not found* (from client)” when calling Web Service that requires signing
  • Firefox OS privileged app: Permission denied to access property 'document' of new window o
  • Send email to multiple recipients based on selected option in php?
  • How does flex-shrink factor in padding and border-box?
  • Internet Explorer Addon Toolbar Button Error
  • How to adapt DirectX-style world/view/projection matrices to OpenGL?
  • Insert statement not working using execute(array()) of PDO Extension
  • Android NDK refer to external libraries in JNI
  • Implementation of timeout in LDAP
  • Floating parent div grows to hypothetical width of floating child div
  • Why my AngularJS async test in Jasmine 1.3.x is not working?