我正在使用自定义适配器来定义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中,或者更好的是,在新类中?
很抱歉发布这么长的帖子,但我希望尽可能多地公开这些信息。
答案 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);