Adapter的实现

Posted tilmto

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Adapter的实现相关的知识,希望对你有一定的参考价值。

Adapter概念:

Adapter是连接后端数据和前端显示的适配接口,是数据和UI(View)之间一个重要的纽带。在常见的View(ListView, GridView)等地方都需要用到Adapter。相当于ios里面tableView,collection的DataSource.我们在使用过程中可以根据自己的需求实现接口或者继承类进行一定的扩展。比较常用的有 Base Adapter,Impleader,Adapter,Counteradaptation等。

常用Adapter:

BaseAdapter是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性;
ArrayAdapter支持泛型操作,最为简单,只能展示一行字;
SimpleAdapter有最好的扩充性,可以自定义出各种效果;
SimpleCursorAdapter可以适用于简单的纯文字型ListView,它需要Cursor的字段和UI的id对应起来。如需要实现更复杂的UI也可以重写其他方法。可以认为是SimpleAdapter对数据库的简单结合,可以方便地把数据库的内容以列表的形式展示出来。

在此对BaseAdapter用法进行详细介绍。

  1. 首先创建一个类继承BaseAdapter
public class ItemBaseAdapter extends BaseAdapter {
    // data  要显示的数据源
    public List<Item> itemList;
    private LayoutInflater inflater;
    //init 构造函数初始化 context为当前的上下文
    public ItemBaseAdapter(Context context, List<Item> data){
    this.inflater = LayoutInflater.from(context);
    this.itemList = data;
    }
}
// 重写父类方法
// 返回数据源数量
@Override
public int getCount() {return itemList.size();}

// 返回的是该position对应的item,即获得相应数据集合中特定位置的数据项
@Override
public Object getItem(int position) {
    return null;
}
// 它返回的是该postion对应item的id, 相当于ios tableView的 indexPath
@Override
public long getItemId(int position) {
    return 0;
}

// 返回了每个item项所显示的view,该view在layout里自定义布局,可重用,相当于tableView自定义的cell
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    //创建ViewHolder 实例并赋值
    ItemViewHolder holder = null;
    if (convertView == null) {
        holder = new ItemViewHolder();
        convertView = inflater.inflate(R.layout.item_view, null);
        holder.title = (TextView)convertView.findViewById(R.id.title);
        holder.desc = (TextView)convertView.findViewById(R.id.desc);
        holder.imageView = (ImageView)convertView.findViewById(R.id.image);
        holder.price = (TextView)convertView.findViewById(R.id.price);
       // 设置视图层次结构
        convertView.setTag(holder);
        
    } else {
        holder = (ItemViewHolder)convertView.getTag();
    }
    
    holder.title.setText(itemList.get(position).getTitle());
    holder.desc.setText(itemList.get(position).getDesc());
    holder.price.setText(price);
    String url = itemList.get(position).getCoverImageUrl();
    // MARK: inflater.getContext()获取当前的上下文
    // 用Picasso框架异步加载网络图片
    Picasso.with(inflater.getContext()).load(url).placeholder(R.drawable.placeholder).error(R.drawable.placeholder).into(holder.imageView);
    }
    return convertView;
}

2.创建ViewHolder类,属性是所有要显示在View上的控件。相当于ios里面的在storyboard里拖一个线到view上,把控件与view相关联。

public final class ItemViewHolder {
    public TextView title;
    public TextView desc;
    public ImageView imageView;
    public TextView price;
}

4.运用BaseAdapter。
在继承与Fragment的类里面创建BaseAdapter的实例,并传入数据源,就可以让Fragment显示自定义的布局和数据.
// 创建ItemBaseAdapter的实例
BaseAdapter adapter = new ItemBaseAdapter(getActivity(),items);
// 设置gridView的adapter
item_grid.setAdapter(adapter);

以上就是BaseAdapter的基本使用。









以上是关于Adapter的实现的主要内容,如果未能解决你的问题,请参考以下文章

我无法从另一个带有 recyclerview.adaper 的片段中打开带有 recyclerview.adapter 的片段

将数据从 RecyclerView.Adapter 传递到片段 onClick

如何从 RecyclerView.Adapter<CardAdapter.ViewHolder> 打开片段

在 Fragment 中使用 Spinner 和 Adapter

在具有多行标题的选项卡上设置片段

view、adapter、getActivity()、infragment 都是 null