使用自定义适配器在ListView中动态更改图标

时间:2015-09-08 17:57:32

标签: android android-listview onclicklistener android-adapter

我正在使用自定义适配器来定义ListView的项目。每个项目都是一个帖子(就像一个论坛),由我在我的数据库中的idpost定义,并有3 ImageViews,允许用户将该帖子标记为收藏,编辑并删除它(如果用户是作者帖子)。

我遇到了制造这种行为的麻烦。到目前为止,这是我的适配器。

public class ComentAdapter extends BaseAdapter {
    private List<Comentario>    mDataset;
    private LayoutInflater      mLayoutInflater;
    private Context             mContext;

    public class ViewHolder {

        public ImageView    imAvatar;
        public TextView     tvAutor;
        public TextView     tvDestinatario;
        public TextView     tvFecha;
        public TextView     tvContenido;
        public TextView     tvArchivo;
        public TextView     tvRespuestas;
        public ImageView    imFav;
        public ImageView    imEditar;
        public ImageView    imBorrar;

    }

    public ComentAdapter(Context context, List<Comentario> items) {
        mContext = context;
        mLayoutInflater = LayoutInflater.from(context);
        mDataset = items;
    }

    public void setDataset(List<Comentario> newDataset) {
        mDataset = newDataset;
    }

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

    @Override
    public Comentario getItem(int position) {
        return mDataset.get(position);
    }

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

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

        if (convertView == null) {
            convertView = mLayoutInflater.inflate(R.layout.comentario_list_item, parent, false);

            holder = new ViewHolder();
            holder.imAvatar = (ImageView) convertView.findViewById(R.id.imAvatar);
            holder.tvAutor = (TextView) convertView.findViewById(R.id.tvAutor);
            holder.tvDestinatario = (TextView) convertView.findViewById(R.id.tvDestinatario);
            holder.tvFecha = (TextView) convertView.findViewById(R.id.tvFecha);
            holder.tvContenido = (TextView) convertView.findViewById(R.id.tvContenido);
            holder.tvArchivo = (TextView) convertView.findViewById(R.id.tvArchivo);
            holder.tvRespuestas = (TextView) convertView.findViewById(R.id.tvRespuestas);
            holder.imFav = (ImageView) convertView.findViewById(R.id.imFav);
            holder.imEditar = (ImageView) convertView.findViewById(R.id.imEditar);
            holder.imBorrar = (ImageView) convertView.findViewById(R.id.imBorrar);

            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }

        Picasso.with(mContext).load(getItem(position).getFoto_autor()).into(holder.imAvatar);

        return convertView;
    }
}

点击ImageView imFav时,我应该在数据库中标记/取消标记该帖子为收藏夹并更改图标。这有效,显示了idpost(就在return convertView;之前):

// idcomentario is the idpost I mentioned
holder.imFav.setTag(getItem(position).idcomentario);

holder.imFav.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(mContext, "" + holder.imFav.getTag(), Toast.LENGTH_SHORT).show();
    }
});

但是当我想改变de icon时我遇到了一些麻烦。我尝试了这两个解决方案(在上面的onClick(View v)方法中):

((ImageView) v).setImageResource(R.drawable.ic_star_relleno);

holder.imFav.setImageResource(R.drawable.ic_star_relleno);

图标会发生变化,但ListView滚动时会错过该更改。我知道我必须通知这样的变化:

adapter.notifyDataSetChanged();

但我不能在这里使用adapter,它应该在我的activity.java中我想。所以我尝试在item_layout.xml中设置onClick。

<ImageView
    android:id="@+id/imFav"
    ...
    android:onClick="onClickFav" />

在activity.java中

public void onClickFav(View v) {
    ((ImageView) v).setImageResource(R.drawable.ic_star_relleno);
    mAdapter.notifyDataSetChanged();
}

但这不起作用。什么都没有改变。

有谁知道如何使这个工作?这是我的主要问题,但我也想知道是否有任何方法可以管理适配器中的所有OnClickListener。在activity.java中,或者更好的是,在新类中?

很抱歉发布这么长的帖子,但我希望尽可能多地公开这些信息。

1 个答案:

答案 0 :(得分:0)

你的Comentario类必须有像

这样的方法
  

boolean isFavorite()

  

void setFavorite(boolean favorite)

然后需要将AdapterView.OnItemClickListener设置为listView

然后在onItemClick()切换收藏状态

@Override
public void onItemClick (AdapterView<?> parent, View view, int position, long id) {
    // toggle favorite state
    getItem(position).setFavorite(!getItem(position).isFavorite());
}

在公共视图中getView添加:

Picasso.with(mContext).load(getItem(position).getFoto_autor()).into(holder.imAvatar);
Picasso.with(mContext).load(getItem(position).isFavorite()? R.drawable.favorite : R.drawable.not_favorite).into(holder.imAvatar);