实现多效果ListView
2016-07-12 22:26
447 查看
某些时候我们需要实现在一个列表中有不同的类型的行,也就是不同项需要有不同的效果,为了实现这个效果,主要在适配器中进行操作例如其中的
创建一个
我们利用枚举类限定了每项的颜色,用label表示每项的标签,然后我们需要一个适配器
一旦viewType确定了,
getItemViewType,
getViewTypeCount。
实现
首先我们要记住虽然没项表现不同但是需要有一个基本的modle,因此第一布就是创造一个足够灵活的modle来支持各种类型,以及内置一个机制来确定各种类型,下面是一个不同颜色的例子创建一个
SimpleColor的类,需要包含显示的颜色和内容的属性
public class SimpleColor { public enum ColorValues {RED, BLUE, GREEN}//枚举 public SimpleColor(String label, ColorValues color) { super(); this.label = label; this.color = color; } public String label; public ColorValues color; }
我们利用枚举类限定了每项的颜色,用label表示每项的标签,然后我们需要一个适配器
public class ColorArrayAdapter extends ArrayAdapter<SimpleColor> { public ColorArrayAdapter(Context context, ArrayList<SimpleColor> objects) { super(context, 0, objects); } //返回view的类型数量,创造者是getView(int, View, ViewGroup) @Override public int getViewTypeCount() { //每种类型都代表了可以被转换view的集合 //values()方法反悔了一个数组 return SimpleColor.ColorValues.values().length; } //得到将会由getView创造的view的种类 @Override public int getItemViewType(int position) { //返回代表vie种类的整数,注意:范围是0~getViewTypeCount()-1 //通过获取枚举类型的序列返回代表类型的整数 return getItem(position).color.ordinal(); } //得到在指定位置展示指定数据的view @Override public View getView(int position, View convertView, ViewGroup parent) { //view应该是基于getItemViewType的类型创造的,并且convertView要保证回收再利用的类型 //是正确的 SimpleColor color = getItem(position); if (convertView == null) { //得到数据项的类型 int type = getItemViewType(position); //基于类型加载XML文件 convertView = getInflatedLayoutForType(type); } //加载控件 TextView tvLabel = (TextView) convertView.findViewById(R.id.tvLable); if (tvLabel != null) { tvLabel.setText(color.label); } return convertView; } //根据项的类型,返回相应的布局文件 private View getInflatedLayoutForType(int type) { if (type == SimpleColor.ColorValues.BLUE.ordinal()) { return LayoutInflater.from(getContext()).inflate(R.layout.item_blue_color, null); } else if (type == SimpleColor.ColorValues.RED.ordinal()) { return LayoutInflater.from(getContext()).inflate(R.layout.item_blue_color, null); } else if (type == SimpleColor.ColorValues.GREEN.ordinal()) { return LayoutInflater.from(getContext()).inflate(R.layout.item_green_color, null); } else { return null; } } }
一旦viewType确定了,
converyView对象就会保证是相对应的布局,在主活动中
public class MainActivity extends AppCompatActivity { private ListView lvColors; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lvColors = (ListView) findViewById(R.id.lvColors); ArrayList<SimpleColor> aColors = new ArrayList<>(); //像数组中存入数据 aColors.add(new SimpleColor("Blue", SimpleColor.ColorValues.BLUE)); aColors.add(new SimpleColor("Green", SimpleColor.ColorValues.GREEN)); //绑定适配器 ColorArrayAdapter adapter = new ColorArrayAdapter(this,aColors); lvColors.setAdapter(adapter);
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories