ListView,GridView,Spinner
适配器
列表框需要适配器,常用的有BaseAdapter,SimpleAdapter和ArrayAdapter
ArrayAdapter
ArrayAdapter非常简单,只有几个参数:上下文,布局资源和数据数组
new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list);
SimpleAdapter
SimpleAdapter也很简单:上下文,数据数组,布局资源,键数组和目标控件ID数组
new SimpleAdapter(this,list,R.layout.list_item,new String[]{"text"},new int[]{R.id.listitemTextView1});
BaseAdapter
BaseAdapter是一个抽象类,需要继承
继承时需要重写这四个函数
public Object getItem(int p1);
public int getCount();
public View getView(int p1, View p2, ViewGroup p3);
public long getItemId(int p1);
完整代码
以ListView为例,另外两个都是一样的
package com.Diamond.listtry;
import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.HashMap;
import android.widget.SimpleAdapter;
import android.widget.BaseAdapter;
import android.content.Context;
import android.view.ViewGroup;
import android.view.View;
import android.view.LayoutInflater;
import android.widget.TextView;
import android.widget.LinearLayout;
public class ListViewActivity extends Activity {
public static final int TYPE_ARRAY_ADAPTER = 0;
public static final int TYPE_SIMPLE_ADAPTER = 1;
public static final int TYPE_BASE_ADAPTER = 2;
public ListView listview;
public BaseAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listview);
Intent intent = getIntent();
int type = intent.getIntExtra("type",TYPE_ARRAY_ADAPTER);
listview = (ListView)findViewById(R.id.activitylistviewListView1);
if(type == TYPE_ARRAY_ADAPTER) {
String[] list = new String[10];
for (int i = 0; i < list.length; i++) {
list[i] = "Array Adapter " + i;
}
adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list);
} else if(type == TYPE_SIMPLE_ADAPTER) {
ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();
for (int i = 0; i < 10; i++) {
HashMap map = new HashMap<String,String>();
map.put("text","Simple Adapter " + i);
list.add(map);
}
adapter = new SimpleAdapter(this,list,R.layout.list_item,new String[]{"text"},new int[]{R.id.listitemTextView1});
} else if(type == TYPE_BASE_ADAPTER) {
adapter = new MyAdapter(this);
}
listview.setAdapter(adapter);
}
public class MyAdapter extends BaseAdapter {
public ArrayList<HashMap<String,String>> list;
public LayoutInflater inflater;
public MyAdapter(Context context) {
inflater = LayoutInflater.from(context);
list = new ArrayList<HashMap<String,String>>();
for (int i = 0; i < 10; i++) {
HashMap map = new HashMap<String,String>();
map.put("text","Base Adapter " + i);
list.add(map);
}
}
@Override
public Object getItem(int p1) {
return list.get(p1);
}
@Override
public int getCount() {
return list.size();
}
@Override
public View getView(int p1, View p2, ViewGroup p3) {
LinearLayout ll = (LinearLayout)inflater.inflate(R.layout.list_item,null);
TextView tv = (TextView)ll.findViewById(R.id.listitemTextView1);
HashMap<String,String> item = (HashMap<String,String>)getItem(p1);
tv.setText(item.get("text"));
return ll;
}
@Override
public long getItemId(int p1) {
return p1;
}
}
}
RecyclerView
RecyclerView和原版的AdapterView不一样,是强制使用ViewHolder的
RecyclerView.Adapter
RecyclerView.Adapter需要重写三个函数
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup p1, int p2);
public void onBindViewHolder(RecyclerView.ViewHolder p1, int p2);
public int getItemCount();
完整代码
package com.Diamond.listtry;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.LinearLayoutManager;
import android.view.ViewGroup;
import android.view.View;
import android.widget.TextView;
import android.view.LayoutInflater;
import java.util.ArrayList;
import android.content.Context;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.DefaultItemAnimator;
import java.util.HashMap;
public class RecyclerViewActivity extends Activity {
public RecyclerView recyclerview;
public RecyclerView.Adapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recyclerview);
recyclerview = (RecyclerView)findViewById(R.id.activityrecycleviewRecyclerView1);
adapter = new MyAdapter(this);
recyclerview.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
recyclerview.setAdapter(adapter);
recyclerview.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));
recyclerview.setItemAnimator(new DefaultItemAnimator());
}
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView tv;
public MyViewHolder(View item) {
super(item);
tv = (TextView)item.findViewById(R.id.listitemTextView1);
}
}
public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
public LayoutInflater inflater;
public ArrayList<HashMap<String,String>> list;
public MyAdapter(Context context) {
inflater = LayoutInflater.from(context);
list = new ArrayList<HashMap<String,String>>();
for (int i = 0; i < 10; i++) {
HashMap<String,String> map = new HashMap<String,String>();
map.put("text","RecycleView " + i);
list.add(map);
}
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup p1, int p2) {
return new MyViewHolder(inflater.inflate(R.layout.list_item,null));
}
@Override
public void onBindViewHolder(MyViewHolder p1, int p2) {
p1.tv.setText(list.get(p2).get("text"));
}
@Override
public int getItemCount() {
return list.size();
}
}
}