Alex
Alex

Reputation: 1239

Android listview item not setting image Resource at proper position

When I click on first item. It does change bookmark icon to filled bookmark icon. But then once I keep scrolling I see another bookmark button was clicked when I clicked first one. So basically view is taking click on several bookmark icon for each list.

<ImageButton
    android:layout_width="36dp"
    android:layout_height="36dp"
    android:id="@+id/bookmark"
    android:focusable="false"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:layout_marginRight="17dp"
    android:layout_marginTop="185dp"
    android:background="@android:color/transparent"
    android:src="@drawable/iconbookmarked" />


    public class HomeListViewAdapter extends BaseAdapter {

    private ArrayList<Card> cardView;
    private LayoutInflater inflater;
    private Context context;

    public HomeListViewAdapter(Context c,  LayoutInflater layoutInflater, ArrayList<Card> item){
        inflater = layoutInflater;
        context = c;
        cardView = item;
    }

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

    @Override
    public Object getItem(int position) {
        return cardView.get(position);
    }

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

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

        View view = convertView;
        final ViewHolder viewHolder;
        final int a = position;

        if(view == null){
            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.home_list_single_row, parent, false);
            viewHolder = new ViewHolder();

            viewHolder.title = (TextView) view.findViewById(R.id.title);
            viewHolder.readMore = (TextView) view.findViewById(R.id.readMore);
            viewHolder.bookMark = (ImageButton) view.findViewById(R.id.bookmark);
            viewHolder.bg = (NetworkImageView) view.findViewById(R.id.bg);

            view.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolder) view.getTag();
            view.setTag(viewHolder);
        }


        viewHolder.title.setTypeface(FontManager.setFont(view.getContext(), FontManager.Font.MontSerratRegular));
        viewHolder.readMore.setTypeface(FontManager.setFont(view.getContext(), FontManager.Font.OpenSansRegular));

        viewHolder.bookMark.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(v.getContext(), "Text " + position, Toast.LENGTH_SHORT).show();
                viewHolder.bookMark.setImageResource(R.drawable.iconbookmarked_filled);
                viewHolder.bookMark.setTag(position);
            }
        });
        viewHolder.title.setText(cardView.get(position).title);
        viewHolder.readMore.setText(cardView.get(position).readMore);
        viewHolder.bg.setImageUrl(cardView.get(position).bg, HomeScreen.imgLoader);

        return view;
    }
}
class ViewHolder{
    ImageButton bookMark;
    TextView title,readMore;
    NetworkImageView bg;
}

Screen shot - http://postimg.org/image/cxxgdkgmb/

Upvotes: 0

Views: 250

Answers (2)

LEETAEJUN
LEETAEJUN

Reputation: 186

add class member variable:

private ArrayList<Integer> selectedPositionList;

in Constructor:

selectedPositionList = new ArrayList<>();

in getView, replace to this code:

else{
    viewHolder = (ViewHolder) view.getTag();
    //view.setTag(viewHolder);               // remove
}

viewHolder.bookMark.setImageResource(R.drawable....); // add code(default image, for init)

and... in setOnClickListener:

selectedPositionList.add(position);

last... add this code:

if(!selectedPositionList.isEmpty()) {
    for(int i = 0; i < selectedPositionList.size(); i++) {
        if(selectedPositionList.get(i) == position) {             
            viewHolder.bookMark.setImageResource(R.drawable.iconbookmarked_filled);
        }
    }
}

Upvotes: 0

Chris Thoma
Chris Thoma

Reputation: 499

Since you're recycling the view, the drawable that you set in the first cell you clicked, is still set in the recycled view. You'll need to have some logic in your get view to check whether or not to set the image to be checked or not checked so that it's always consistent.

Upvotes: 1

Related Questions