simpleAdapter图片实现过程
示例代码:
后台逻辑:
package com.hsj.example.advcontroldemo01;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Gallery;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private Gallery gallery;
/**
* 声明简单适配器对象
*/
private SimpleAdapter adapter;
/**
* 声明数据源对象
*/
private List<Map<String,Object>> data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.gallery= (Gallery) this.findViewById(R.id.gallery);
try {
this.adapter=this.getAdapter();
this.gallery.setAdapter(adapter);
//注册当条目被选中时对应的监听器对象
this.gallery.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
/**
* 当条目被选中时自动调用的方法
* @param parent
* @param view
* @param position
* @param id
*/
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
//1.根据数据源获取
//Map<String,Object> map=data.get(position);
//String name=map.get("name").toString();
//2.根据适配器对象获取数据
// Map<String,Object> map= (Map<String, Object>) adapter.getItem(position);
//String name=map.get("name").toString();
//3.根据适配器控件获取数据
//Map<String,Object> map= (Map<String, Object>)parent.getItemAtPosition(position);
//String name=map.get("name").toString();
System.out.println("==onItemSelected(AdapterView<?> parent="+parent+", View view="+view+", int position="+position+", long id="+id+")==");
//4.根据用户点击的条目获取数据
TextView textView_name= (TextView) view.findViewById(R.id.textView_name);
String name=textView_name.getText().toString();
Toast.makeText(getApplicationContext(),"name="+name, Toast.LENGTH_LONG).show();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
this.gallery.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Map<String,Object> map=data.get(position);
String name=map.get("name").toString();
Toast.makeText(getApplicationContext(),"name="+name, Toast.LENGTH_LONG).show();
}
});
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
/**
* 返回适配器对象
* @return
*/
private SimpleAdapter getAdapter() throws IllegalAccessException {
data=getData();
adapter=new SimpleAdapter(
this,//上下文对象
data,//数据源
R.layout.gallery_item,//gallery 控件每一个条目对象对应的布局文件的id值
new String[]{"header","name"},//数据源中Map的键值组成的字符串数组
new int[]{R.id.imageView_header,R.id.textView_name} //gallery 控件每一个条目对象中控件的id值组成的int数组
);
return adapter;
}
/**
* 返回数据源对象
* @return
*/
/*private List<Map<String, Object>> getData() {
data=new ArrayList<>();
for(int i=0;i<24;i++){
Map<String,Object> map=new HashMap<>();
map.put("header",R.drawable.png_01+i);
map.put("name","小丽"+i);
data.add(map);
}
return data;
}*/
/**
* 使用反射获取数据源
* @return
*/
private List<Map<String, Object>> getData() throws IllegalAccessException {
data=new ArrayList<>();
/*
获取类模板Class对象的方式有哪些?
A:Class clz=对象名.getClass()
B:Class clz=类名.class
C:Class clz=Class.forName("类名字符串")
*/
//获取类模板对象
Class clz=R.drawable.class;
//获取R.drawale 类中所有的字段对象
//clz.getFields();//获取本类及其父类中所有使用public修饰的字段对象
Field[] fields=clz.getDeclaredFields();//获取本类中所有字段,不管访问修饰符是什么,但不包括父类中的字段
//System.out.println(fields.length);
int count=0;
int len=fields.length;
for(int i=0;i<len;i++){
//根据索引值获取指定字段对象
Field field=fields[i];
//获取字段的名字
String name=field.getName();
//获取以png开头的字段对象:name.startsWith("png")如果name 以png开头则返回true,否则返回false
if(name.startsWith("png")){
Map<String,Object> map=new HashMap<>();
//获取字段的值
Object fieldValue=field.get(null);
map.put("header",fieldValue);
map.put("name","小丽"+count++);
data.add(map);
}
}
return data;
}
}
注意事项:这里要在res文件下添加一个自定义的xml文件。。。