Android开发笔记之Adapter用法
2016-06-28 22:26
267 查看
Adapter的概念
适配器对象作为视图和该视图的基础数据之间的桥梁。适配器提供对数据项的访问。适配器还负责对数据集中的每个项目进行视图的视图。三个要素:
Data—连接—Adapter—连接—View
Adapter接口的继承关系如下图:
[b][/b]
重写 getView()方法的工作原理:
1.ListView 向 Adapter 对于List中的每一条数据索要一个View ,“give me a view” (getView)。
2.一个新的View 返回并且展示。
但是出现下面的情况,系统内存无法满足,*ListView里面的条目过多,例如 ,100000万条。其中只有可见的项目存在内存中,其他的在Recycler中。其实我的理解Recyler就是一个队列,用来存储不在屏幕范围内的item,如果item滚出屏幕范围,那么就入队,这里的滚出是完全滚出,即边界等也要完全滚出。如果新的item要滚进来,那么android系统的framework就会查看Recyler是否含有可以重复使用的iew,如果有那么就重新设置该iew
的数据源,然后显示,即出队。
常用的Adapter实现的类有:
(1)ArrayAdapter,支持泛型,可以展示一行字符串。ArrayAdapterDemo:
使用系统自带的android.R.layout.simple_list_item_1布局文件。
[b]MainActivity.java文件[/b]
package edu.jnu.adapterdemo; import android.app.Activity; import android.content.Context; import android.net.Uri; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.View; import android.view.Menu; import android.view.MenuItem; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toast; import com.google.android.gms.appindexing.Action; import com.google.android.gms.appindexing.AppIndex; import com.google.android.gms.common.api.GoogleApiClient; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class MainActivity extends Activity { private ListView listView; private List<String> list; private ArrayAdapter arrayAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.listView); list = new ArrayList<String>(); for (int i = 1; i < 100; i++) { list.add("item" + i); } arrayAdapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,list); listView.setAdapter(arrayAdapter); } }
(2).SimpleAdapter可以添加各种各样的组件,灵活易用。
lv_layout.xml文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:id="@+id/img" android:layout_width="60dp" android:layout_height="60dp" android:layout_margin="5dp" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22sp" /> <TextView android:id="@+id/text2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="12sp"/> </LinearLayout> </LinearLayout>
MainActivity.java文件
package edu.jnu.adapterdemo; import android.app.Activity; import android.content.Context; import android.net.Uri; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.View; import android.view.Menu; import android.view.MenuItem; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toast; import com.google.android.gms.appindexing.Action; import com.google.android.gms.appindexing.AppIndex; import com.google.android.gms.common.api.GoogleApiClient; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class MainActivity extends Activity implements AdapterView.OnItemClickListener { private ListView listView; private List<String> list; private SimpleAdapter simpleAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.listView); list = new ArrayList<String>(); for (int i = 1; i < 100; i++) { list.add("item" + i); } simpleAdapter = new SimpleAdapter(this,getdata(),R.layout.lv_layout, new String[]{"title","info","image"}, new int[]{R.id.text1,R.id.text2,R.id.img}); listView.setAdapter(simpleAdapter); listView.setOnItemClickListener(this); } private List<Map<String,Object>> getdata(){ List<Map<String,Object>> list = new ArrayList<Map<String,Object>>(); Map<String,Object> map = new HashMap<String,Object>(); map.put("title","Title1"); map.put("info","Info1"); map.put("image",R.drawable.i1); list.add(map); map = new HashMap<String,Object>(); map.put("title","Title2"); map.put("info","Info2"); map.put("image",R.drawable.i1); list.add(map); map = new HashMap<String,Object>(); map.put("title","Title3"); map.put("info","Info3"); map.put("image",R.drawable.i1); list.add(map); return list; } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(this,"pos:"+position,Toast.LENGTH_SHORT).show(); } }
(3).BaseAdapter:可以对ListView的性能进行优化,通过重写GetView方法。
采用ViewHolder模式。
lv_layout.xml文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:id="@+id/img" android:layout_width="60dp" android:layout_height="60dp" android:layout_margin="5dp" android:layout_weight="1" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_weight="4" > <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22sp" /> <TextView android:id="@+id/info" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="12sp"/> </LinearLayout> <Button android:id="@+id/imgbtn" android:layout_width="60dp" android:layout_height="60dp" android:layout_margin="5dp" android:background="@drawable/selector" android:gravity="right" /> </LinearLayout>
ViewHolder.java文件
package edu.jnu.adapterdemo; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; /** * Created by roly on 16/6/28. */ final public class ViewHolder { public ImageView imageView; public TextView title; public TextView info; public Button viewBtn; }
MyAdapter.java文件
package edu.jnu.adapterdemo; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; /** * Created by roly on 16/6/28. */ class MyAdapter extends BaseAdapter { private MainActivity mainActivity; private LayoutInflater layoutInflater; public MyAdapter(MainActivity mainActivity, Context context) { this.mainActivity = mainActivity; this.layoutInflater = LayoutInflater.from(context); } @Override public int getCount() { return mainActivity.mData.size(); } @Override public Object getItem(int position) { return mainActivity.mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null; if (convertView == null) { viewHolder = new ViewHolder(); convertView = layoutInflater.inflate(R.layout.lv_layout, null); viewHolder.imageView = (ImageView) convertView.findViewById(R.id.img); viewHolder.title = (TextView) convertView.findViewById(R.id.title); viewHolder.info = (TextView) convertView.findViewById(R.id.info); viewHolder.viewBtn = (Button) convertView.findViewById(R.id.imgbtn); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.imageView.setBackgroundResource((Integer) mainActivity.mData.get(position).get("image")); viewHolder.title.setText((String) mainActivity.mData.get(position).get("title")); viewHolder.info.setText((String) mainActivity.mData.get(position).get("info")); viewHolder.viewBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mainActivity.showInfo(); } }); return convertView; } }
MainActivity.java文件
package edu.jnu.adapterdemo; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.widget.ListView; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class MainActivity extends Activity { private ListView listView; List<Map<String,Object>> mData; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.listView); mData = getdata(); MyAdapter adapter = new MyAdapter(this, this); listView.setAdapter(adapter); } //数据源 public List<Map<String,Object>> getdata(){ List<Map<String,Object>> list = new ArrayList<Map<String,Object>>(); Map<String,Object> map = new HashMap<String,Object>(); map.put("title","Title1"); map.put("info","Info1"); map.put("image",R.drawable.i1); list.add(map); map = new HashMap<String,Object>(); map.put("title","Title2"); map.put("info","Info2"); map.put("image",R.drawable.i2); list.add(map); map = new HashMap<String,Object>(); map.put("title","Title3"); map.put("info","Info3"); map.put("image",R.drawable.i3); list.add(map); return list; } public void showInfo(){ new AlertDialog.Builder(this) .setTitle("Alert") .setMessage("Introduce") .setPositiveButton("ok",new DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { } }) .show(); } }
项目源码:
http://download.csdn.net/detail/ymmqwe/9562334相关文章推荐
- Android Intent对象隐式意图激活并携带数据到系统的信息页面
- Java/Android中的3DES加密
- android studio问题集锦二—更新ing
- 解惑Android的post()方法究竟运行在哪个线程中
- 关于android studio 端口被占用问题
- Android样式与主题
- Java/Android中的DES加密
- Android 开发之旅——Android Studio2 安装 GO!
- Android学习路线图
- android opengl es代码功能
- Android资源文件中各种XML的作用与解释
- Android studio 开发中 修改项目后,构建快速启动生效,配置Run示意
- 【Android】解决在RelativeLayout中使用ImageView, adjustViewBounds 无效
- android 吐丝、指示框
- Android获取读取内部存储-初级
- android listview 用法
- Android EditText实现只能输入几位整数几位小数
- Android EditText的TextWatcher监听回调参数详解
- Android显示系统设计框架介绍
- 调用Android系统关机命令