自定义适配器
来源:互联网 发布:即时通讯软件下载 编辑:程序博客网 时间:2024/05/21 06:57
前面我们学习了SimpleAdapter这个利用键值对把数据映射到控件上的这种适配器,但是在实际的安卓开发中更多的是用的下面要介绍的自定义适配器。因为SimpleAdapter不适合较为复杂的业务逻辑。
自定义Adapter的步骤
1.继承BaseAdapter:建立类,继承BaseAdapter,需要重写四个抽象方法,添加数据集合和反射器(inflater)实现构造器和setter方法(主要是传入数据);
2.实现getView方法(重要):实现四个抽象方法中的getView:首先反射行布局,获取各个布局,然后给布局赋值;
3.关联ListView:实例化适配器,关联ListView。
getView方法的含义:它是系统渲染时调用的方法。系统显示什么数据,就是看该方法返回什么样的View。然而这个View这个方法前面时没有了,这时候就要靠Inflater这个反射器,来将XML文件,转化成一个实际的View。
下面粘一下效果图:
下面粘一下Demo的代码,这里是在上一次的工程基础上操作的,所以只粘贴关键部分了
MyAdapter.java
package com.example.dreamcreationman.listview;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;import java.util.List;import java.util.Map;/** * Created by Dream on 2017/2/21. */public class MyAdapter extends BaseAdapter { List<Map<String,Object>> list; LayoutInflater inflater; public MyAdapter(Context context) { this.inflater=LayoutInflater.from(context); } public void setList(List<Map<String, Object>> list) { this.list = list; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view= inflater.inflate(R.layout.ti,null); ImageView logo= (ImageView) view.findViewById(R.id.logo); TextView name = (TextView) view.findViewById(R.id.name); TextView version = (TextView) view.findViewById(R.id.version); TextView size = (TextView) view.findViewById(R.id.size); Map map=list.get(position); logo.setImageResource((Integer) map.get("logo")); name.setText((String) map.get("name")); version.setText((String) map.get("version")); size.setText((String) map.get("size")); return view; }}
MainActivity.java
package com.example.dreamcreationman.listview;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.SimpleAdapter;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Objects;public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView listView= (ListView) findViewById(R.id.lv); List<Map<String,Object>> list=new ArrayList<Map<String,Object>>(); Map<String,Object> map=new HashMap<String, Object>(); map.put("logo",R.mipmap.ic_launcher); map.put("name","Android"); map.put("version","v1.0"); map.put("size","大小:11M"); list.add(map); map=new HashMap<String, Object>(); map.put("logo",R.mipmap.ic_launcher); map.put("name","Java"); map.put("version","v2.0"); map.put("size","大小:12M"); list.add(map); map=new HashMap<String, Object>(); map.put("logo",R.mipmap.ic_launcher); map.put("name","C++"); map.put("version","v3.0"); map.put("size","大小:13M"); list.add(map); map=new HashMap<String, Object>(); map.put("logo",R.mipmap.ic_launcher); map.put("name","C"); map.put("version","v4.0"); map.put("size","大小:14M"); list.add(map); MyAdapter myAdapter=new MyAdapter(this); myAdapter.setList(list); listView.setAdapter(myAdapter); }}
中间有些采用到前面的内容,参见笔者以前的笔记ListView和简单适配器
ListView的常用事件
onItemClick:item项的点击事件
onItemLongClick:item项的长按事件
代码我也粘在这:
package com.example.dreamcreationman.listview;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.ListView;import android.widget.Toast;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView listView= (ListView) findViewById(R.id.lv); List<Map<String,Object>> list=new ArrayList<Map<String,Object>>(); Map<String,Object> map=new HashMap<String, Object>(); map.put("logo",R.mipmap.ic_launcher); map.put("name","Android"); map.put("version","v1.0"); map.put("size","大小:11M"); list.add(map); map=new HashMap<String, Object>(); map.put("logo",R.mipmap.ic_launcher); map.put("name","Java"); map.put("version","v2.0"); map.put("size","大小:12M"); list.add(map); map=new HashMap<String, Object>(); map.put("logo",R.mipmap.ic_launcher); map.put("name","C++"); map.put("version","v3.0"); map.put("size","大小:13M"); list.add(map); map=new HashMap<String, Object>(); map.put("logo",R.mipmap.ic_launcher); map.put("name","C"); map.put("version","v4.0"); map.put("size","大小:14M"); list.add(map); MyAdapter myAdapter=new MyAdapter(this); myAdapter.setList(list); listView.setAdapter(myAdapter); listView.setOnItemClickListener(this); listView.setOnItemLongClickListener(this); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(this,"点击"+position,Toast.LENGTH_SHORT).show(); } @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(this,"长按"+position,Toast.LENGTH_SHORT).show(); return false; }}
这里有两个点需要注意:
1.长按和点击事件实现的接口不同;
2.长按实现的时候返回值True或者false可以简单理解为希望长按事件后不再触发点击事件,就将值设置为true。false代表不笑话事件,继续传事件;而true表示消化事件,当然设置true也会导致长按过久以后的背景色变化事件不再进行,这也是设置为true的副作用。
好了有关Android Studio里自定义适配器的分享就到这里了,欢迎在评论区留言指出错误,希望和大家一起进步!
谢谢观看。
- 自定义适配器
- 自定义适配器
- 自定义适配器
- 自定义适配器
- 自定义适配器
- 自定义适配器
- 自定义适配器
- 自定义适配器
- 自定义适配器
- 自定义适配器
- 自定义适配器
- 自定义适配器
- 自定义适配器
- 简单适配器(自定义适配器)
- 自定义ListView适配器onclick
- ListView自定义适配器
- ListView 之 自定义适配器
- 自定义适配器小结
- 微信小程序ui布局常用技巧
- 用shell脚本写的一个交互式linux命令行工具
- 深入理解 Spring 事务原理
- 419. Battleships in a Board
- 机器学习----笔记之支持向量机(5)
- 自定义适配器
- iOS APP 本地数据存储和缓存
- 如何看Youtube 1080p 高清
- 小波滤波出现负值的原因
- aes、base64转码、Json转换、md5工具类demo
- 手把手叫你 制作一个不需要任何工具 从网页上安装ipa包的办法
- OkHttp response.body().string()
- Oracle 数据库导入导出 dmp文件
- 晨魅--时间处理方法