Adapter中getView方法的陷阱

我們在爲列表寫適配器的時候通常是implements BaseAdapter,實現它的抽象方法,java用一些好的結構減小了findViewByID的次數(參考鏈接),可是這就需要程序員們注意個問題,每次從內存中取出來的item是隨機從以往的ViewGroup取出來的,資源重複利用從而減小了內存消耗,但同時也由於之前對某部分內存的配置沒有清理,再使用時就需要手動修改,否則會有意想不到的後果發生。
今天簡單分析一下,希望給各位同胞留個前車之鑑。
這是個消息隊列的適配器,只發送文本消息,每條消息的顯示用MyMessageView來控制,消息發出後收到服務器的確定,MyMessageView的getIsUpLoad()方法纔會返回true,所以我們要手動的控制進度條ProcessBar的顯示與否。

class MessageAdpter implements BaseAdapter
{
    //一些變量聲明
    //構造函數
    //addView()
    //一些必須完善的抽象方法
    @Override
    public View getView(int position,View convertView, Viewgroup parent)
    {
        ViewHolder holder = null;
        MyMessageView msgView = ls_msgViews.get(position);
        if(convertView==null)
        {
            holder = new ViewHolder();
            convertView =  LayoutInflater.from(context).inflate(R.layout.view_message, null);
            holder.content = (TextView)convertView.findViewByID(R.id.tv_message_content);
            holder.process = (ProcessBar)convertView.findViewByID(R.id.pb_message_process);
            convertView.setTag(holder);
        }
        else
        {
            holder = (ViewHolder) convertView.getTag();
        }
        //這句是關鍵,必須手動將processBar顯示
        holder.process.setVisibility(View.VISIBLE);
        if(msgView.getIsUpLoad())
        {
            holder.process.setVisibility(View.GONE);
        }
        return convertView;
    }
    //(這裏爲什麼要用static來修飾此內部類?希望和童鞋們交流)
    static class ViewHolder
    {
        TextView content;
        ProcessBar process;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章