在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 list = new ArrayList();

for (int i = 0; i < data.length; i++) {

Map map = new LinkedHashMap();

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 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> dataList;

private int resourceId;

public CustomAdapter(Context context, List> dataList, int resourceId) {

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 map = dataList.get(position);

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> dataList = new ArrayList<>();

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 = new LinkedHashMap<>();

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);

}

}