Android - ListView ArrayAdapter VIewHolder

本文介绍如何在Android中创建自定义的ListView适配器,包括定义数据模型MessageItem,实现MessageListAdapter来继承ArrayAdapter并使用ViewHolder模式提高性能,以及在Activity中设置ListView和Adapter。

Android - ListView ArrayAdapter VIewHolder

很久没写Android,一写突然忘掉一堆,也找不到我想要的解,

自己再重写一遍,(原来我认为的基本,结果当我需要的时候,找不到,这基本算是满重要的)

首先要先建立自己的Model

MessageItem 如下

public class MessageItem {
    public String Title = "初始標題";
    public String Content = "知始內容";

    public String getTitle() {
        return this.Title;
    }

    public void setTitle(String value) {
        this.Title = value;
    }
    public String getContent() {
        return this.Content;
    }

    public void setContent(String value) {
        this.Content = value;
    }

}

然后建立继承ArrayAdapter,并使用泛型

public class MessageListAdapter extends ArrayAdapter<MessageItem> {
    private Context mContext;

    static class ViewHolder{
        TextView mTitle;
        TextView mContent;
    }

    public MessageListAdapter(Context ctx) {
        super(ctx, R.layout.item_message);
        mContext = ctx;
    }

    @Override
    public View getView(int position,  View convertView, ViewGroup parent) {
        LayoutInflater inflater =  (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        ViewHolder holder;

        if (convertView == null) {
            holder = new ViewHolder();
            convertView = inflater.inflate(R.layout.item_message, null);
            holder.mTitle = (TextView) convertView.findViewById(R.id.tv_title);
            holder.mContent = (TextView) convertView.findViewById(R.id.tv_content);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        MessageItem item = this.getItem(position);

        holder.mTitle.setText(item.getTitle());
        holder.mContent.setText(item.getContent());

        return convertView;
    }
}

在Activity页面,取得ListView 后,设定Adapter

mListMessgae = (ListView) this.findViewById(R.id.list_message);
 mAdapter = new MessageListAdapter(this);
 mListMessgae.setAdapter(mAdapter);

这之间当然有要捞资料的部分使用的AsyncTask

 public class LoadTask extends AsyncTask<Void, Void, Void> {
        public List<MessageItem> mItems = new ArrayList<MessageItem>();
        @Override
        protected Void doInBackground(Void... voids) {
            mItems = appApi.GetMessages();
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            mAdapter.clear();;
            mAdapter.addAll(mItems);
            mAdapter.notifyDataSetChanged();
        }
    }

Activity OnCreate的时候执行

        LoadTask task = new LoadTask();
        task.execute();

完成

Android中,ListView是一个常见的用于显示列表数据的组件。为了提高性能并减少内存消耗,ListView使用了View Holder设计模式。View Holder的作用是在每个ListItem不再需要时复用其视图,而不是每次滚动时都创建新的View。 举个例子,假设我们有一个简单的Adapter,它负责将List<YourItem>的数据填充到ListView: ```java public class YourListAdapter extends ArrayAdapter<YourItem> { private ViewHolder viewHolder; public static class ViewHolder { TextView textViewName; ImageView imageViewIcon; // 其他可能的视图... } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { viewHolder = new ViewHolder(); convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list_view, parent, false); viewHolder.textViewName = convertView.findViewById(R.id.text_view_name); viewHolder.imageViewIcon = convertView.findViewById(R.id.image_view_icon); // 绑定ViewHolder convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } YourItem item = getItem(position); viewHolder.textViewName.setText(item.getName()); viewHolder.imageViewIcon.setImageResource(item.getIconResourceId()); return convertView; } } ``` 在这个例子中,当列表滚动时,如果`convertView`(已经缓存的视图)不是null,我们就直接复用它;如果`convertView`是null,我们就新创建一个,并将其放入缓存。这样可以显著减少垃圾回收的工作量,提升应用程序的响应速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值