1

I need to show list of images in list view, for i done image loading process in a listview using CustomAdapter, here my problem is i need to show only one image ie the visible count must be only one. i need to avoid showing 2 images images. Pleaser find the attachment for your reference. (i must use listview for this)enter image description here and my code is

MainActivity.Java:

public class MainActivity extends Activity {
    ListView mList;

    String[] imageURL = {
            "http://ptsdperspectives.org/wp-content/uploads/2013/07/sleepingbaby.jpg",
            "http://images2.fanpop.com/image/photos/14300000/Sweet-Angels-sweety-babies-14394647-1600-1200.jpg",
            "http://1.bp.blogspot.com/-QDe-qthaKz0/UAWZ6aakdoI/AAAAAAAAFK4/2zlaIu1r20Q/s1600/baby.jpg",
            "http://images4.fanpop.com/image/photos/17400000/Sweet-angel-sweety-babies-17465667-600-399.jpg",
            "http://media.npr.org/assets/img/2013/05/02/istock-11437508-baby-hat_custom-83708739a42b84de8f35d7a57ee868fce921d619-s6-c30.jpg",
            "http://my.fakingnews.firstpost.com/files/2013/09/Baby.jpg",
            "http://i.telegraph.co.uk/multimedia/archive/02165/swaddle-baby_2165340b.jpg" };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mList = (ListView) findViewById(R.id.image_list_view);
        ArrayList<String> mArrayList = new ArrayList<String>();
        for (String s : imageURL) {
            mArrayList.add(s);
        }
        CustomImageAdapter mAdapter = new CustomImageAdapter(MainActivity.this,
                mArrayList);
        mList.setAdapter(mAdapter);
        mAdapter.notifyDataSetChanged();
        // mList.setOnScrollListener(new OnScrollListener() {
        //
        // @Override
        // public void onScrollStateChanged(AbsListView view, int scrollState) {
        // // TODO Auto-generated method stub
        // Log.e("onScrollStateChanged -scrollState", scrollState + "");
        // }
        //
        // @Override
        // public void onScroll(AbsListView view, int firstVisibleItem,
        // int visibleItemCount, int totalItemCount) {
        // Log.e("onScroll -firstVisibleIteml", firstVisibleItem + "");
        // Log.e("onScroll -visibleItemCount", visibleItemCount + "");
        // Log.e("onScroll -totalItemCount", totalItemCount + "");
        // // TODO Auto-generated method stub
        // }
        // });
    }

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

CustomAdapter.Java

public class CustomImageAdapter extends BaseAdapter {

    private Activity activity;
    private static LayoutInflater inflater = null;
    protected ImageLoader imageLoader = ImageLoader.getInstance();
    DisplayImageOptions options;
    ArrayList<String> url = new ArrayList<String>();

    @SuppressWarnings("deprecation")
    public CustomImageAdapter(Activity a, ArrayList<String> url2) {

        activity = a;
        url = url2;
        inflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        imageLoader.init(ImageLoaderConfiguration.createDefault(activity));
        options = new DisplayImageOptions.Builder().resetViewBeforeLoading()
                .cacheOnDisc().imageScaleType(ImageScaleType.IN_SAMPLE_INT)
                .bitmapConfig(Bitmap.Config.RGB_565)
                .displayer(new FadeInBitmapDisplayer(100)).build();

    }

    public int getCount() {
        return url.size();
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public static class ViewHolder {
        public TextView u_name;
        public ImageView icon;

    }

    public View getView(int position, View convertView, ViewGroup parent) {
        View vi = convertView;
        ViewHolder holder;
        if (convertView == null) {
            vi = inflater.inflate(R.layout.list_items, null);
            holder = new ViewHolder();
            holder.icon = (ImageView) vi.findViewById(R.id.images_bg);
            vi.setTag(holder);
        } else
            holder = (ViewHolder) vi.getTag();

        holder.icon.setTag(url.get(position));
        imageLoader.displayImage(url.get(position), holder.icon);

        return vi;
    }
}
Aerrow
  • 12,086
  • 10
  • 56
  • 90
  • 4
    You can use ViewPager also please check.. http://developer.android.com/training/animation/screen-slide.html – Virag Brahme Jan 06 '14 at 12:59
  • just set the imageviews height to screenheight-actionbarheight... – Daniel Bo Jan 06 '14 at 13:01
  • 1
    @Virag: Yes but mostly horizontal pagers are available. I tried vertical pager library code from this link https://github.com/JakeWharton/Android-DirectionalViewPager/ .unfortunately i got " java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState" error so only i searching like above – Aerrow Jan 06 '14 at 13:01
  • @DanielBo: but the user can hold the list in-between the two images am i right? :( – Aerrow Jan 06 '14 at 13:05
  • Just out of curiousity, why can you only use a ListView? I dont get that part. – Paul Jan 06 '14 at 13:08
  • @Paul: Actually initially i start view Vertical Viewpager library unfortunaltely it Shows " java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState" error so only i moved here – Aerrow Jan 06 '14 at 13:11
  • @Aerrow, Any ViewPager you try and use will require a java support v4, it should have been included in the /extras/android/compatibility/v4 . – Paul Jan 06 '14 at 13:15
  • If this isnt helping, I suggest you take another look at the previous code you had, a java.lan.IllegalStateException can be easily solved! Good luck! :) – Paul Jan 06 '14 at 13:16
  • @Paul: I refereed and user this library https://github.com/JakeWharton/Android-DirectionalViewPager/ – Aerrow Jan 06 '14 at 13:18
  • @Aerrow, Now I see. I would use the googles tutorial as you will learn much more than to use a pre-packages solution like this. Trust me, it pays in the end. The reward is much more pleasent too. :) – Paul Jan 06 '14 at 13:20
  • you could override on the onScroll interface and make it page, if you really have to use listview xD – Daniel Bo Jan 06 '14 at 13:23

3 Answers3

1

A ListView is made for lists of several objects. You only want to show one item at a time? Try using a ViewPager. Here's a great tutorial for it:

http://developer.android.com/training/animation/screen-slide.html

I hope this helps.

Paul
  • 478
  • 2
  • 16
0

May be it will be possible but if you use ViewPager then it will be more reliable solution.

Follow this code:

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
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.view.ViewPager;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.MarginLayoutParams;
import android.view.Window;
import android.widget.*;

public class DemoPhotoAlbumActivity extends FragmentActivity implements AdapterView.OnItemSelectedListener, ViewPager.OnPageChangeListener {

    private ViewPager viewPager;
    ImageButton home,file,spanner,info;
  //  private Gallery gallery;

    protected Integer[] mImageIds = {

            R.drawable.screen_02,
            R.drawable.screen_03,
            R.drawable.screen_04,
            R.drawable.screen_05,
            R.drawable.screen_06,
    };

//    protected Integer[] mImageIdsTab = {
//            R.drawable.tab1,
//            R.drawable.tab2,
//            R.drawable.tab3,
//            R.drawable.tab4,
//            R.drawable.tab5,
//            R.drawable.tab6,
//    };

    private Handler handler;

    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.image_gallery);

        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);

        viewPager = (ViewPager) findViewById(R.id.view_pager);
//        home= (ImageButton) findViewById(R.id.home_icon);
//        file= (ImageButton) findViewById(R.id.folder_icon);
//        spanner=(ImageButton) findViewById(R.id.spanner_icon);
//        info=(ImageButton) findViewById(R.id.info_icon);

        viewPager.setAdapter(new MyAdapter(getSupportFragmentManager()));
        viewPager.setOnPageChangeListener(this);

        /*gallery = (Gallery) findViewById(R.id.gallery); 

        // set gallery to left side
        MarginLayoutParams mlp = (MarginLayoutParams) gallery.getLayoutParams();
        mlp.setMargins(-(metrics.widthPixels / 2 + (142/2)), mlp.topMargin,
                    mlp.rightMargin, mlp.bottomMargin);

        gallery.setSelection(1);
        gallery.setAdapter(new ImageAdapter());
        gallery.setOnItemSelectedListener(this);       
        */
        handler = new Handler();

    }

    // gallery item selected
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
        updateUI(i);
    }

    // view pager item selected
    public void onPageSelected(int i) {

        updateUI(i);
    }

    private void updateUI(final int i) {
        viewPager.setCurrentItem(i);
    }

    public void onNothingSelected(AdapterView<?> adapterView) {    }

    public void onPageScrolled(int i, float v, int i1) {    }

    public void onPageScrollStateChanged(int i) {    }

    public class ImageAdapter extends BaseAdapter {

        public int getCount() {
            return mImageIds.length;
        }

        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) 
        {

            ImageView imageView = new ImageView(DemoPhotoAlbumActivity.this);

            imageView.setImageResource(mImageIds[position]);
            imageView.setLayoutParams(new Gallery.LayoutParams(150, 100));
            imageView.setScaleType(ImageView.ScaleType.FIT_XY);

            return imageView;
        }
    }

    public class MyAdapter extends FragmentPagerAdapter {
        public MyAdapter(FragmentManager fm) {
            super(fm);
        }

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

        @SuppressLint("ValidFragment")
        @Override
        public Fragment getItem(final int position) {
            return new Fragment() {
                @Override
                public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                    ImageView imageView = new ImageView(DemoPhotoAlbumActivity.this);
                    //imageView.setImageResource(mImageIds[position]);
                    imageView.setBackgroundResource(mImageIds[position]);
                    return imageView;
                }
            };
        }
    }


}

and layout will be

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout android:layout_height="fill_parent"
             android:layout_width="fill_parent"

        >
    <android.support.v4.view.ViewPager 
        android:id="@+id/view_pager"
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"

            />        
</FrameLayout>

Follow this , just change the image name.

Satyaki Mukherjee
  • 2,857
  • 1
  • 22
  • 26
0

You may set the height and width of your listview same as the height and width of images you are loading this may help to show only one image at a time.

Harsh Patel
  • 459
  • 3
  • 11