在J2EE中,MVC是一种非常好的框架,它实现了数据模型M(Model)、控制器C(Controller)和视图V(View)之间的分离。在Android中,有一种高级控件AdapterView,它的实现过程类似于MVC框架。AdapterView的内容一般是包含多项相同格式资源的列表,可以将前端显示和后端数据分离。AdapterView可以分为四类:ListView、Spinner、Gallery和GridView。每种类型的AdapterView都有自己的特点和事件,可以通过setOnItemClickListener和setOnItemLongClickListener等方法来处理用户交互。
AdapterView中的数据源相当于MVC框架中的M(模型),而Adapter相当于MVC框架中的C(控制器)。当用户单击列表项时,会触发onItemClick()方法;当用户长按列表项时,会触发onItemLongClick()方法。为了将数据源中的数据以某种样式(xml文件)显示在视图中,需要借助下面的Adapter适配器对象进行适配。
一、ArrayAdapter
1. 特点:只能处理列表项内容全是文本的情况。
2. 数据源:数组或者List
二、SimpleAdapter
1. 特点:不仅可以处理列表项全是文本的情况,当列表项中还有其他控件时,同样可以处理。
2. 数据源:只能为List
三、自定义Adapter
1. 创建类,继承自BaseAdapter。
2. 重写其中的四个方法:
a. int getCount():返回的是数据源对象的个数,即列表项数。
b. Object getItem(int position):返回指定位置position上的列表。
c. long getItemId(int position):返回指定位置处的行ID。
d. View getView():返回列表项对应的视图,方法体中实例化视图,用视图填充器根据Xml文件实例化视图,根据布局找到控件并设置属性,最后返回View视图。
四、具体应用
1. 声明AdapterView对象,根据ID利用findViewById方法找到此对象。
2. 声明Adapter对象,根据构造方法实例化此对象。具体如下:
a. ArrayAdapter<数据类型> adapter = new ArrayAdapter<数据类型>(context:一般指当前Activity对象,layout:每个列表项显示的布局,data:数据源变量)。
b. SimpleAdapter adapter = new SimpleAdapter(context:一般指当前Activity对象,data:数据源变量,layout:每个列表项显示的布局,new String[]{}:数据源中的“键”,new int[]{}:显示数据源的控件ID)。
c. 自定义Adapter类 adapter = new 自定义Adapter类构造方法。
3. 绑定Adapter对象到Adapter上:AdapterView对象.setAdapter(Adapter对象)。
以下是重构后的代码:
```java
public class MainActivity extends Activity {
private ListView lv; // 适配器控件------->V视图
private ArrayAdapter adapter; // 适配器------>C控制器
private String[] data = {"我是第1个列表项", "我是第2个列表项", "我是第3个列表项", "我是第4个列表项",
"我是第5个列表项", "我是第6个列表项", "我是第7个列表项"}; // 数据源-->M
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找到ListView
lv = (ListView) findViewById(R.id.listView1);
// 实现适配器,利用系统定义的样式,加载数据源
adapter = new ArrayAdapter<>(this, R.layout.list_item_view, data);
lv.setAdapter(adapter);
}
}
```
注意:这里假设你已经有一个名为`list_item_view.xml`的布局文件,用于显示每个列表项。
this, android.R.layout.simple_list_item_1, data); // 使用自定义视图 R.layout.cell
// 使用系统定义的视图样式
lv.setAdapter(adapter);
// 处理单击事件:列表项被单击时给出提示信息
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, "第" + (position + 1) + "项被单击按下", Toast.LENGTH_LONG).show();
}
});
// 处理长时间按下事件:列表项被长时间按下时给出提示信息
lv.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView> parent, View view, int position, long id) {
return true;
}
});
parent, View view, int position, long id) {
Toast.makeText(MainActivity.this, "第" + (position + 1) + "项被长时间按下", Toast.LENGTH_LONG).show();
return true;
}
});
public class MainActivity extends Activity {
//声明Spinner
private Spinner sp;
//声明Adapter
private SimpleAdapter adapter;
//数据源
private String[] data = {"我是第1个列表项", "我是第2个列表项", "我是第3个列表项", "我是第4个列表项", "我是第5个列表项", "我是第6个列表项", "我是第7个列表项", "我是第8个列表项", "我是第9个列表项"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找到Spinner
sp = (Spinner) findViewById(R.id.spinner1);
//将数据添加到List
ArrayList
for (int i = 0; i < data.length; i++) {
Map
map.put("key", i);
map.put("value", data[i]);
list.add(map);
}
//用SimpleAdapter填充Spinner
adapter = new SimpleAdapter(this, list, R.layout.spinner_item, new String[]{"key", "value"}, new int[]{R.id.textview1, R.id.textview2});
//设置下拉刷新监听器和上拉加载更多监听器
final ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setMessage("正在加载中...");
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.setCancelable(true);
progressDialog.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
refresh();
}
});
sp.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView> parent, View view, int position, long id) {
progressDialog.show();
longPressEvent(parent, view, position, id);
return true;
}
});
sp.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView> parent, View view, int position, long id) {
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
}
@Override
public void onNothingSelected(AdapterView> parent) {
}
});
}
首先,我们需要创建一个HashMap来存储数据。然后遍历数据数组,将每个数据项添加到HashMap中。接着实例化SimpleAdapter,并将数据和布局文件传递给它。最后,将SimpleAdapter绑定到Spinner上。
以下是重构后的代码:
```java
// 创建一个HashMap来存储数据
Map
for (int i = 0; i < data.length; i++) {
// 将数据项添加到HashMap中
map = new HashMap<>();
map.put("data", data[i]);
list.add(map);
}
// 实例化SimpleAdapter
SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.cell, new String[]{"data"}, new int[]{R.id.textView1});
// 将SimpleAdapter绑定到Spinner上
sp.setAdapter(adapter);
```
以下是根据您提供的内容重构后的代码:
```java
public class MainActivity extends AppCompatActivity {
// 声明GridView
private GridView gv;
// 声明SimpleAdapter
private SimpleAdapter adapter;
// 数据源
private int[] imageIds = {R.drawable.item1, R.drawable.item2, R.drawable.item3, R.drawable.item4, R.drawable.item5, R.drawable.item6, R.drawable.item7, R.drawable.item8, R.drawable.item9, R.drawable.item10, R.drawable.item11, R.drawable.item12, R.drawable.item13, R.drawable.item14, R.drawable.item15 };
private String[] data = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化GridView和SimpleAdapter
gv = findViewById(R.id.gv);
adapter = new SimpleAdapter(this, imageIds, data);
// 将SimpleAdapter设置到GridView中显示
gv.setAdapter(adapter);
}
}
```
在Android开发中,我们经常需要使用GridView来展示图片。为了实现自定义的AdapterView填充Gallery,我们需要创建一个自定义的Adapter类,并重写其方法以满足我们的需求。以下是一个简单的示例:
1. 首先,我们需要创建一个自定义的Adapter类,继承自BaseAdapter。在这个类中,我们需要重写getCount()、getItem(int position)和getView(int position, View convertView, ViewGroup parent)这三个方法。
```java
public class CustomAdapter extends BaseAdapter {
private Context context;
private List
private int resourceId;
public CustomAdapter(Context context, List
this.context = context;
this.dataList = dataList;
this.resourceId = resourceId;
}
@Override
public int getCount() {
return dataList.size();
}
@Override
public Object getItem(int position) {
return dataList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = View.inflate(context, resourceId, null);
viewHolder = new ViewHolder();
viewHolder.imageView = convertView.findViewById(R.id.imageView);
viewHolder.textView = convertView.findViewById(R.id.textView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
Map
viewHolder.imageView.setImageResource((Integer) map.get("image"));
viewHolder.textView.setText((String) map.get("data"));
return convertView;
}
static class ViewHolder {
ImageView imageView;
TextView textView;
}
}
```
2. 在Activity或Fragment中,我们需要创建一个GridView实例,并设置其适配器为我们刚刚创建的CustomAdapter。同时,我们需要提供一些数据给CustomAdapter。例如:
```java
private void initGridView() {
GridView gridView = findViewById(R.id.gridView);
List
int[] imageIds = new int[]{R.drawable.image1, R.drawable.image2, R.drawable.image3};
int[] data = new int[]{"数据1", "数据2", "数据3"};
for (int i = 0; i < imageIds.length; i++) {
Map
map.put("image", imageIds[i]);
map.put("data", data[i]);
dataList.add(map);
}
CustomAdapter adapter = new CustomAdapter(this, dataList, R.layout.grid_item);
gridView.setAdapter(adapter);
}
```
3. 最后,我们需要在布局文件中定义一个GridView:
```xml
android:id="@+id/gridView" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 自定义Adapter的代码如下: ```java public class MyAdapter extends BaseAdapter { //上下文 private Context context; //资源 private int[] imageids; //构造方法 public MyAdapter(Context context, int[] imageids) { //上下文 this.context = context; this.imageids = imageids; } @Override //返回数据源长度 public int getCount() { return imageids.length; } @Override //返回对应位置处的数据 public Object getItem(int position) { return imageids[position]; } @Override //返回对应位置的行ID public long getItemId(int position) { return position; } @Override //返回列表项的显示样式视图 public View getView(int position, View convertView, ViewGroup parent) { //ImageView控件 ImageView iv = new ImageView(context); //添加资源到控件上 iv.setImageResource(imageids[position]); //控件在父级控件的显示样式 iv.setLayoutParams(new Gallery.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); //返回视图 return iv; }} ``` 主视图的部分没有提供具体的代码,所以无法重构。 public class MainActivity extends Activity { //声明Gallery private Gallery gy; //声明自定义Adapter private MyAdapter adapter; //数据源 private int[] imageids = {R.drawable.w1, R.drawable.q1, R.drawable.q2, R.drawable.q3, R.drawable.q4, R.drawable.q5, R.drawable.q6, R.drawable.q7, R.drawable.q8, R.drawable.q9}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //找到Gallery gy = (Gallery) findViewById(R.id.gy); //实例化适配器 adapter = new MyAdapter(this, imageids); //绑定适配器到Gallery上 gy.setAdapter(adapter); } }