我們在爲列表寫適配器的時候通常是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;
}
}