Android列表视图项目没有设置图像资源在适当的位置

时间:2015-09-01 01:06:53

标签: android listview imagebutton onitemclicklistener

当我点击第一个项目时。它确实将书签图标更改为填充书签图标。但是一旦我继续滚动,当我点击第一个时,我看到另一个书签按钮被点击了。因此,基本上视图是点击每个列表的几个书签图标。

<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;
}

屏幕截图 - http://postimg.org/image/cxxgdkgmb/

2 个答案:

答案 0 :(得分:1)

由于您正在回收视图,因此您在单击的第一个单元格中设置的drawable仍在循环视图中设置。您需要在获取视图中使用一些逻辑来检查是否要设置要检查的图像或不检查图像,以使其始终保持一致。

答案 1 :(得分:0)

添加类成员变量:

private ArrayList<Integer> selectedPositionList;
构造函数中的

selectedPositionList = new ArrayList<>();
在getView中

,替换为此代码:

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

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

和...在setOnClickListener中:

selectedPositionList.add(position);

最后......添加此代码:

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