Android adapter适配器的使用
说起Adapter的使用,首先想到的就是listview或各种各样的Adapter。下面我们对常用的一些Adapter进行简单的使用讲解。
这是Adapter的关系图:
下面的所有例子均使用同一个布局文件:
main.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" android:orientation="vertical" > <ListView android:id="@+id/MyListView" android:layout_width="fill_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout>
ListView之SimpleAdapter
SimpleAdapter的构造函数是:
public SimpleAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
参数context:上下文,比如this。关联SimpleAdapter运行的视图上下文
参数data:Map列表,列表要显示的数据,这部分需要自己实现,如例子中的getData(),类型要与上面的一致,每条项目要与from中指定条目一致
参数resource:ListView单项布局文件的Id,这个布局就是你自定义的布局了,你想显示什么样子的布局都在这个布局中。这个布局中必须包括了to中定义的控件id
参数 from:一个被添加到Map上关联每一个项目列名称的列表,数组里面是列名称
参数 to:是一个int数组,数组里面的id是自定义布局中各个控件的id,需要与上面的from对应。
下面是主要的代码:
package com.topcsa.test_listview; import java.util.ArrayList; import java.util.HashMap; import android.app.Activity; import android.app.ActionBar; import android.app.Fragment; import android.content.Intent; import android.os.Bundle; import android.os.Looper; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; import android.os.Build; public class MainActivitySimpleAdapter extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ListView listview = (ListView) findViewById(R.id.MyListView); // 生成动态数组,并且转载数据 ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>(); for (int i = 0; i < 30; i++) { HashMap<String, String> map = new HashMap<String, String>(); map.put("ItemTitle", "This is Title....."); map.put("ItemText", "This is text....."); mylist.add(map); } // 生成适配器,数组===》ListItem SimpleAdapter mSchedule = new SimpleAdapter(this, // 没什么解释 mylist,// 数据来源 R.layout.my_listitem_simpleadapter,// ListItem的XML实现 // 动态数组与ListItem对应的子项 new String[] { "ItemTitle", "ItemText" }, // ListItem的XML文件里面的两个TextView ID new int[] { R.id.ItemTitle, R.id.ItemText }); // 添加并且显示 listview.setAdapter(mSchedule); listview.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(); intent.putExtra("content",position); intent.setClass(MainActivitySimpleAdapter.this, ContentActivitySimpleAdapter.class); startActivity(intent); } }); } }
以下是对应的效果图:
ListView之ArrayAdapter的使用:
他的构造函数如下:
其中Context为当前的环境变量,可以显示一行文字的一个布局文件,和一个List的集合,也就是数据源。布局文件可以自己写,也可以用系统的,我这里是用的系统的。自己写的布局中包含一个TextView就可以了,当然系统中也有包含一个TextView的布局文件:就是 android.R.layout.simple_expandable_list_item_1,调用这个比较方便。
主要代码:
package com.topcsa.test_listview; import java.util.ArrayList; import android.app.Activity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListView; public class MainActivityArrayAdapter extends Activity { private ListView mListView; private ArrayList<String> mArrayList = new ArrayList<String>(); @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.main); mListView = (ListView) findViewById(R.id.MyListView); mListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, getData())); } private ArrayList<String> getData() { mArrayList.add("测试数据1"); mArrayList.add("测试数据2"); mArrayList.add("测试数据3"); mArrayList.add("测试数据4"); mArrayList.add("测试数据5"); mArrayList.add("测试数据6"); return mArrayList; } }
运行结果如下:
LsitView之BaseAdapter的使用:
BaseAdapter是需要被继承的。
package com.topcsa.test_listview; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; public class MainActivityBaseAdapter extends Activity { ListView listView; String[] titles = { "标题1", "标题2", "标题3", "标题4" }; String[] texts = { "文本内容A", "文本内容B", "文本内容C", "文本内容D" }; int[] resIds = { R.drawable.ic_launcher, R.drawable.ic_launcher, R.drawable.ic_launcher, R.drawable.ic_launcher }; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.main); this.setTitle("BaseAdapter for ListView"); listView = (ListView) this.findViewById(R.id.MyListView); listView.setAdapter(new ListViewAdapter(titles, texts, resIds)); } public class ListViewAdapter extends BaseAdapter { View[] itemViews; public ListViewAdapter(String[] itemTitles, String[] itemTexts, int[] itemImageRes) { itemViews = new View[itemTitles.length]; for (int i = 0; i < itemViews.length; i++) { itemViews[i] = makeItemView(itemTitles[i], itemTexts[i], itemImageRes[i]); } } public int getCount() { return itemViews.length; } public View getItem(int position) { return itemViews[position]; } public long getItemId(int position) { return position; } // LayoutInflater的作用是,把一个View的对象与XML布局文件关联并实例化。 // View的对象实例化之后,可以通过findViewById()查找布局文件中的指定Id的组件。 private View makeItemView(String strTitle, String strText, int resId) { LayoutInflater inflater = (LayoutInflater) MainActivityBaseAdapter.this .getSystemService(Context.LAYOUT_INFLATER_SERVICE); // 使用View的对象itemView与R.layout.item关联 View itemView = inflater.inflate(R.layout.my_listitem_baseadapter, null); // 通过findViewById()方法实例R.layout.item内各组件 TextView title = (TextView) itemView.findViewById(R.id.itemTitle); title.setText(strTitle); TextView text = (TextView) itemView.findViewById(R.id.itemText); text.setText(strText); ImageView image = (ImageView) itemView.findViewById(R.id.itemImage); image.setImageResource(resId); return itemView; } public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) return itemViews[position]; return convertView; } } }
运行结果:
LsitView之SimpleCursorAdapter的使用:(该方法已被遗弃)
构造函数如下:
主要代码如下:
package com.topcsa.test_listview; import android.app.Activity; import android.database.Cursor; import android.os.Bundle; import android.provider.Contacts.People; import android.widget.ListView; import android.widget.SimpleCursorAdapter; public class MainActivitySimlpeCursorAdapter extends Activity { private ListView mListView; private Cursor mCursor; private SimpleCursorAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mListView = (ListView) findViewById(R.id.MyListView); mCursor = getContentResolver().query(People.CONTENT_URI, null, null, null, null); startManagingCursor(mCursor); mAdapter = new SimpleCursorAdapter( MainActivitySimlpeCursorAdapter.this, android.R.layout.simple_expandable_list_item_1, mCursor, new String[] { People.NAME }, new int[] { android.R.id.text1 }); mListView.setAdapter(mAdapter); } }
运行效果如下:
文章出处:http://www.cnblogs.com/scetopcsa/
欢迎关注微信公众号:yilu_yiyou(一路一游),一个不仅仅是代码的世界!
如果文中有什么错误,欢迎指出。以免更多的人被误导。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。