-1

I have a ListView,I am having a custom ListItem designed for it having some TextView's and an ImageView. I want to change that particular image when clicked . I have tried but when i click on that image from ListView, the below listItem's image is changing.

For example if i click on 0th position image then image is changing of 1st position ListIem and when i scroll up and down the List,it changes randomly.

I dont know what is happening with it,I have used notifydatasetChanged on my adapter,But its not working,My code is as below.

Please help me,Thank you,

Code

 private class RssAdapter extends ArrayAdapter<RSSFeed_SelectedHotelResult> {
        private List<RSSFeed_SelectedHotelResult> rssFeedLst;
        int selectedPosition;

        public RssAdapter(Context context, int textViewResourceId,
                List<RSSFeed_SelectedHotelResult> rssFeedLst) {
            super(context, textViewResourceId, rssFeedLst);
            this.rssFeedLst = rssFeedLst;
            Boolean addtoShotlist;
        }

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

            View view = convertView;

            if (convertView == null) {
                view = View.inflate(HotelListActivity.this, R.layout.list_row,
                        null);

                rssHolder = new RssHolder();
                rssHolder.iv_add = (ImageView) view.findViewById(R.id.iv_add);
                rssHolder.rssTitleView = (TextView) view
                        .findViewById(R.id.title);
                rssHolder.tv_offer = (TextView) view.findViewById(R.id.tv_ofr);
                rssHolder.rssImagHotel = (ImageView) view
                        .findViewById(R.id.hotelImage);
                rssHolder.rssImageHotelRate = (ImageView) view
                        .findViewById(R.id.rateHotel2);
                rssHolder.rssHotelPrice = (TextView) view
                        .findViewById(R.id.textHotelRate);
                rssHolder.rssHotelAddress = (TextView) view
                        .findViewById(R.id.textHotelDesc);
                // rssHolder.adres = (TextView) view.findViewById(R.id.adres);
                // rssHolder.rssHotelRating = (TextView)
                // view.findViewById(R.id.textHotelRating);
                rssHolder.rating_hotel = (RatingBar) view
                        .findViewById(R.id.rateHotelImage);
                rssHolder.tv_currcode = (TextView) view
                        .findViewById(R.id.tv_currcode);

                view.setTag(rssHolder);

            } else {
                rssHolder = (RssHolder) view.getTag();

            }

            final RSSFeed_SelectedHotelResult rssFeed = rssFeedLst
                    .get(position);

            rssHolder.rssTitleView.setText(rssFeed.getName());
            imageLoader.DisplayImage(rssFeed.getHotel_image(),
                    rssHolder.rssImagHotel);
            imageLoader.DisplayImage_rating(rssFeed.getHote_rate_image(),
                    rssHolder.rssImageHotelRate);

            rssHolder.rssHotelPrice.setText(rssFeed.getHotel_price());

            rssHolder.rssHotelAddress.setText(rssFeed.getHotel_desc());
            rssHolder.rating_hotel.setRating(Float.valueOf(rssFeed
                    .getHotel_rate()));
            rssHolder.tv_currcode.setText(Consts.currencyCode);
            if (rssFeed.getoffer() != null) {
                rssHolder.tv_offer.setText("**" + rssFeed.getoffer() + "**");
            } else {
                rssHolder.tv_offer.setText("");
            }

            rssHolder.iv_add.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    selectedPosition = position;
                    try {

                        if (position == selectedPosition) {

                            rssHolder.iv_add
                                    .setBackgroundResource(R.drawable.fill);

                        } else {

                            rssHolder.iv_add
                                    .setBackgroundResource(R.drawable.plus12);
                        }

                    } catch (IndexOutOfBoundsException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();

                    }
                    System.out
                            .println("::::::::::::My data in side hotel List activity:::::::::;"
                                    + position
                                    + ""
                                    + rssFeed.getName()
                                    + "\n"
                                    + rssFeed.getHotel_price());

                    /*
                     * RSSFeed_SelectedHotelResult rssFeed1 = rssFeedLst
                     * .get(position);
                     */

                }
            });

            return view;
        }
    }
John Watson
  • 15
  • 2
  • 8

3 Answers3

1

For notify data-set changed your calling the wrong method the correct method is adapter.notifyDataSetChanged()

Dominic D'Souza
  • 961
  • 2
  • 7
  • 16
  • you dont need to call notifyDataSetChanged from within your onClick when you change the image..notifyDataSetChanged has to be called when the data in your List rssFeedLst gets modified probably from your activity – Dominic D'Souza Mar 03 '15 at 06:37
0

1.) Write this code inside your custom adapter getView :

if (position == selectedPosition) {

            imageview.setBackgroundResource(R.drawable.image1);

        } else {

            imageview.setBackgroundResource(R.drawable.normal);
        } 

2.) Make a method in custom adapter :

public void setSelected(int position) {
        selectedPosition = position;
    }

//where selectPosition is private int selectedPosition = -1;

3.) Call this method from activity listitem click like :

   ((Category_Adapter) adapter).setSelected(position);
            listview.invalidate();
  1. Make sure your listview set to single choice mode.
cafebabe1991
  • 4,928
  • 2
  • 34
  • 42
Surender Kumar
  • 1,123
  • 8
  • 15
0
private class RssAdapter extends ArrayAdapter<RSSFeed_SelectedHotelResult> {
        private List<RSSFeed_SelectedHotelResult> rssFeedLst;
       private int selectedPosition =-1;// initalize position

        public RssAdapter(Context context, int textViewResourceId,
                List<RSSFeed_SelectedHotelResult> rssFeedLst) {
            super(context, textViewResourceId, rssFeedLst);
            this.rssFeedLst = rssFeedLst;
            Boolean addtoShotlist;
        }
//make this method
public void setSelected(int position) {
        selectedPosition = position;
    }
        public View getView(final int position, View convertView,
                ViewGroup parent) {

            View view = convertView;

            if (convertView == null) {
                view = View.inflate(HotelListActivity.this, R.layout.list_row,
                        null);

                rssHolder = new RssHolder();
                rssHolder.iv_add = (ImageView) view.findViewById(R.id.iv_add);
                rssHolder.rssTitleView = (TextView) view
                        .findViewById(R.id.title);
                rssHolder.tv_offer = (TextView) view.findViewById(R.id.tv_ofr);
                rssHolder.rssImagHotel = (ImageView) view
                        .findViewById(R.id.hotelImage);
                rssHolder.rssImageHotelRate = (ImageView) view
                        .findViewById(R.id.rateHotel2);
                rssHolder.rssHotelPrice = (TextView) view
                        .findViewById(R.id.textHotelRate);
                rssHolder.rssHotelAddress = (TextView) view
                        .findViewById(R.id.textHotelDesc);
                // rssHolder.adres = (TextView) view.findViewById(R.id.adres);
                // rssHolder.rssHotelRating = (TextView)
                // view.findViewById(R.id.textHotelRating);
                rssHolder.rating_hotel = (RatingBar) view
                        .findViewById(R.id.rateHotelImage);
                rssHolder.tv_currcode = (TextView) view
                        .findViewById(R.id.tv_currcode);

                view.setTag(rssHolder);

            } else {
                rssHolder = (RssHolder) view.getTag();

            }

            final RSSFeed_SelectedHotelResult rssFeed = rssFeedLst
                    .get(position);

            rssHolder.rssTitleView.setText(rssFeed.getName());
            imageLoader.DisplayImage(rssFeed.getHotel_image(),
                    rssHolder.rssImagHotel);
            imageLoader.DisplayImage_rating(rssFeed.getHote_rate_image(),
                    rssHolder.rssImageHotelRate);

            rssHolder.rssHotelPrice.setText(rssFeed.getHotel_price());

            rssHolder.rssHotelAddress.setText(rssFeed.getHotel_desc());
            rssHolder.rating_hotel.setRating(Float.valueOf(rssFeed
                    .getHotel_rate()));
            rssHolder.tv_currcode.setText(Consts.currencyCode);
            if (rssFeed.getoffer() != null) {
                rssHolder.tv_offer.setText("**" + rssFeed.getoffer() + "**");
            } else {
                rssHolder.tv_offer.setText("");
            }

            rssHolder.iv_add.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                   //remove selectposition = position

                    try {

                        if (position == selectedPosition) {

                            rssHolder.iv_add
                                    .setBackgroundResource(R.drawable.fill);

                        } else {

                            rssHolder.iv_add
                                    .setBackgroundResource(R.drawable.plus12);
                        }

                    } catch (IndexOutOfBoundsException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();

                    }
                    System.out
                            .println("::::::::::::My data in side hotel List activity:::::::::;"
                                    + position
                                    + ""
                                    + rssFeed.getName()
                                    + "\n"
                                    + rssFeed.getHotel_price());

                    /*
                     * RSSFeed_SelectedHotelResult rssFeed1 = rssFeedLst
                     * .get(position);
                     */

                }
            });

            return view;
        }
    }

Finally call adapter selected method from activity listitem click and set position.

Surender Kumar
  • 1,123
  • 8
  • 15