Reputation: 1239
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
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
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