0

我正在使用自定義適配器來定義ListView的項目。每個項目都是一個帖子(就像論壇),由我的數據庫中的idpost定義,並允許用戶將該帖子標記爲收藏,編輯並刪除它(如果用戶是帖子的作者)。使用自定義適配器在ListView中動態更改圖標

我有麻煩來開發此行爲。這是我的適配器到目前爲止。

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被點擊我要標記/取消該崗位作爲在DB的喜愛和更改圖標。此作品,展示(只return convertView;之前)idpost:

// 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(); 
    } 
}); 

但我有一些麻煩的時候我想改變德圖標。我想這兩個解決方案(上述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

必須更新mDataset基礎數據。因爲當列表中的項目滾動時,它通過適配器從您的mDataset重新加載 – ant

回答

0

您Comentario類必須有一個像

布爾isFavorite()方法

無效setFavorite(布爾最愛)

則需要設置AdapterView.OnItemClickListener給你l istView

然後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); 
+0

對不起,但我不明白你的答案。我的Comentario課程確實有你提到的兩種方法。我應該如何將AdapterView.OnItemClickListener設置爲我的listView?我應該在哪裏複製'onItemClick'方法? – DandyCC

+0

閱讀此http://developer.android.com/reference/android/widget/AdapterView.html#setOnItemClickListener(android.widget.AdapterView.OnItemClickListener)。使用listView.setOnItemClickListener(mOnItemClickListener);而不是爲列表中的每個項目設置OnClickListener – ant

+0

好吧,我剛剛做到了。但也許我沒有解釋自己,我不想做任何事情'onItemClick',我想做一些事情''OnViewInsideItemClick'「,我的意思是,當用戶點擊一個視圖(在這種情況下''ImageView')一個物品。 – DandyCC

相關問題