MVC模式
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
MVC框架图
Adapter
Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。Adapter提供对数据项的访问,还负责对数据集中的每个项目进行查看。在常见的View(List View,Grid View)等地方都需要用到Adapter。Adapter是MVC的Controller的部分。
Data、Adapter、View三者的关系
继承结构
实际应用的几个Adapter:
BaseAdapter:抽象类,实际开发中我们会继承这个类并且重写相关方法,用得最多的一个Adapter
ArrayAdapter:支持泛型操作,最简单的一个Adapter,只能展现一行文字
SimpleAdapter:同样具有良好扩展性的一个Adapter,可以自定义多种效果
SimpleCursorAdapter:用于显示简单文本类型的listView,一般在数据库那里会用到,不过有点过时, 不推荐使用
ListView
ListView是Android中最常用的几个空间之一,几乎所有的应用程序都会用到它。ListView可以展示大量数据,允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上的内容则会滚动出屏幕。
列表的显示需要三个元素:
ListVeiw:用来展示列表的View
适配器:用来把数据映射到ListView上的中介
数据:具体的将被映射的字符串,图片,或者基本组件
基本属性
stackFromBottom:
设置该属性之后显示列表的最下面,值为true和false
Android:stackFromBottom=”true”transciptMode:
需要用ListView 或其它显示大量Items的控件实时跟踪或查看信息时,希望最新的条目可以自动滚动到可视范围内。则通过设置控件的transcriptMode属性可以将Android平台的控件(支持ScrollBar)自动滑动到最底部。
android:transcriptMode=”alwaysScroll”cacheColorHint:
改变背景需要准备一张图片,然后指定属性android:background=”@drawable/bg”,设置背景后,当拖动或点击list空白位置的时候发现ListItem都变成黑色的了,反而破坏了整体效果。
如果只是换背景的颜色的话,可以直接指定 android:cacheColorHint 为你所要的颜色,
如果是用图片做背景的话,那也只要将android:cacheColorHint指定为透明(#00000000)divider:
该属性的作用是在每一项于每一项之间需要设置一个图片做为间隔,或是去掉item之间的分割线
android:divider=”@drawable/list_driver” 其中 @drawable/list_driver 是一个图片资源,如果不想显示分割线则,只要设置为android:divider=”@drawable/@null”fadingEdge:
上边和下边有黑色的阴影
android:fadingEdge=”none” 设置后没有阴影scrollbars:
隐藏listView的滚动条,
android:scrollbars=”none”与setVerticalScrollBarEnabled(true);的效果是一样的,不活动的时候隐藏,活动的时候也隐藏fadeScrollbars:
android:fadeScrollbars=”true” 配置ListView布局的时候,设置这个属性为true就可以实现滚动条的自动隐藏和显示。fastScrollEnabled:
很多开发者不知道ListView列表控件的快速滚动滑块是如何启用的,其实辅助滚动滑块只需要一行代码就可以搞定:
如果你使用XML布局,只需要在ListView节点中加入 android:fastScrollEnabled=”true” 这个属性即可,而对于Java代码可以通过myListView.setFastScrollEnabled(true); 来控制启用,参数false为隐藏。
还有一点就是当滚动内容较小,不到当前ListView的3个屏幕高度时则不会出现这个快速滚动滑块,同时该方法仍然是AbsListView的基础方法,可以在ListView或GridView等子类中使用快速滚动辅助。drawSelectorOnTop:
android:drawSelectorOnTop=”true” 点击某一条记录,颜色会显示在最上面,记录上的文字被遮住,所以点击文字不放,文字就看不到
android:drawSelectorOnTop=”false”点击某条记录不放,颜色会在记录的后面,成为背景色,但是记录内容的文字是可见的,属性默认值是false.
基本使用
布局代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
Java代码
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//要显示的数据
String[] strs = {"apple","banana","watermelon","pear","cherry"};
//创建ArrayAdapter
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,strs);
//获取ListView对象,通过调用setAdapter方法为ListView设置Adapter设置适配器
ListView list_test = (ListView) findViewById(R.id.list_test);
list_test.setAdapter(adapter);
}
}
定制ListView的界面
新建MyData类,作为ListView适配器的适配类型
public class MyData {
private String name;
private int imageId;
public MyData(String name, int imageId) {
this.name = name;
this.imageId = imageId;
}
public String getName() {
return name;
}
public int getImageId() {
return imageId;
}
}
为ListView的子项指定一个自定义的布局mydata_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/mydata_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/mydata_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp" />
</LinearLayout>
自定义适配器类
public class MyDataAdapter extends ArrayAdapter<MyData> {
private int resourceId;
public MyDataAdapter(Context context, int textViewResourceId, List<MyData> objects) {
super(context, textViewResourceId, objects);
resourceId = textViewResourceId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Fruit mydata = getItem(position);
View view;
ViewHolder viewHolder;
if (convertView == null) {
view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
viewHolder = new ViewHolder();
viewHolder.myDataImage = (ImageView) view.findViewById(R.id.mydata_image);
viewHolder.myDataName = (TextView) view.findViewById(R.id.mydata_name);
view.setTag(viewHolder);
} else {
view = convertView;
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.myDataImage.setImageResource(myData.getImageId());
viewHolder.myDataName.setText(myData.getName());
return view;
}
class ViewHolder {
ImageView myDataImage;
TextView myDataName;
}
}
修改MainActivity的代码
public class MainActivity extends AppCompatActivity {
private List<MyData> myDataList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initMyData();
myDataAdapter adapter = new myDataAdapter(MainActivity.this, R.layout.mydata_item, myDataList);
ListView listView = (ListView) findViewById(R.id.list_view);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
MyData myData = myDataList.get(position);
Toast.makeText(MainActivity.this, myData.getName(), Toast.LENGTH_SHORT).show();
}
});
}
private void initMyData() {
for (int i = 0; i < 2; i++) {
MyData apple = new MyData("Apple", R.drawable.apple_pic);
myDataList.add(apple);
MyData banana = new MyData("Banana", R.drawable.banana_pic);
myDataList.add(banana);
MyDataorange = new MyData("Orange", R.drawable.orange_pic);
myDataList.add(orange);
MyDatawatermelon = new MyData("Watermelon", R.drawable.watermelon_pic);
myDataList.add(watermelon);
MyDatapear = new MyData("Pear", R.drawable.pear_pic);
myDataList.add(pear);
MyDatagrape = new MyData("Grape", R.drawable.grape_pic);
myDataList.add(grape);
MyDatapineapple = new MyData("pineapple", R.drawable.pineapple_pic);
myDataList.add(pineapple);
MyDatastrawberry = new MyData("strawberry", R.drawable.strawberry_pic);
myDataList.add(strawberry);
MyDatacherry = new MyData("cherry", R.drawable.cherry_pic);
myDataList.add(cherry);
MyDatamango = new MyData("mango", R.drawable.mango_pic);
myDataList.add(mango);
}
}
}