在本文中,我们将为您详细介绍android-Listview.setadapter引发nullpointer异常的相关知识,并且为您解答关于androidnullpointerexception的疑问
在本文中,我们将为您详细介绍android-Listview.setadapter引发nullpointer异常的相关知识,并且为您解答关于android nullpointerexception的疑问,此外,我们还会提供一些关于13.Android-ListView使用、BaseAdapter/ArrayAdapter/SimpleAdapter适配器使用、Android BaseAdapter:在getView()重新输入时convertView null、Android ListView Adapter的getItemViewType和getViewTypeCount多种布局、Android ListView 和 BaseAdapter的有用信息。
本文目录一览:- android-Listview.setadapter引发nullpointer异常(android nullpointerexception)
- 13.Android-ListView使用、BaseAdapter/ArrayAdapter/SimpleAdapter适配器使用
- Android BaseAdapter:在getView()重新输入时convertView null
- Android ListView Adapter的getItemViewType和getViewTypeCount多种布局
- Android ListView 和 BaseAdapter
android-Listview.setadapter引发nullpointer异常(android nullpointerexception)
代码如下
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent i = getIntent();
ArrayList<String> imageUrl = i.getStringArrayListExtra("ImageUrl");
String[] companyImageUrl = imageUrl.toArray(new String[0]);
ListView companyList = null;
LazyAdapter companyListViewAdapter;
companyList = (ListView)findViewById(R.id.companylist);
companyListViewAdapter = new LazyAdapter(companyListView.this , companyImageUrl);
try {
companyList.setAdapter(companyListViewAdapter);//exception here
} catch (Exception e) {
System.out.println(e);
}
setContentView(R.layout.company_list);
}
编辑:添加了Lazyadapter代码
public class LazyAdapter extends BaseAdapter {
private Activity activity;
private String[] data;
private static LayoutInflater inflater=null;
public ImageLoader imageLoader;
public LazyAdapter(Activity a, String[] d) {
activity = a;
data=d;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageLoader= new ImageLoader(activity.getApplicationContext());
}
public int getCount() {
return data.length;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public static class ViewHolder{
public TextView text;
public ImageView image;
}
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
ViewHolder holder;
UrlList urlList;
urlList = XMLParser.urlList;
if(convertView==null){
vi = inflater.inflate(R.layout.item, null);
holder=new ViewHolder();
holder.text=(TextView)vi.findViewById(R.id.text);;
holder.image=(ImageView)vi.findViewById(R.id.image);
vi.setTag(holder);
}
else
holder=(ViewHolder)vi.getTag();
String[] categoryNameStrings = urlList.getCategoryName().toArray(new String[0]);
holder.text.setText(categoryNameStrings[position]);
holder.image.setTag(data[position]);
imageLoader.displayImage(data[position], activity, holder.image);
return vi;
}
}
解决方法:
使用setContentView(R.layout.company_list); aftersuper.onCreate(savedInstanceState);
13.Android-ListView使用、BaseAdapter/ArrayAdapter/SimpleAdapter适配器使用
https://www.cnblogs.com/lifexy/archive/2020/02/04/12261805.html
1.ListView
ListView 是 Android 系统为我们提供的一种列表显示的一种控件,使用它可以用来显示我们常见的列表形式。继承自抽象类 AdapterView。继承图如下所示:
以微信好友列表为例:
里面的每个好友就是由一个个 item 组成的,而每个item都存在Adapter适配器类中(负责数据处理),然后通过ListView显示出来.
2.ListView显示原理
ListView显示数据原理实际就是MVC设计模式,如下图所示:
- Model(模型) – 数据集合,用来存储数据组织
- View(视图) – ListView,负责数据显示
- Controller(控制器) - 负责管理Model,并设置要显示的哪个具体数据.
3.使用BaseAdapter适配器
BaseAdapter比较简单,主要是通过继承此类来实现BaseAdapter的四个方法:
public int getCount();
//设置适配器中数据集的数据个数(ListView要显示的所有数据行);
public Object getItem(int position):
//获取数据集中与索引对应的数据项;
public long getItemId(int position);
//获取指定行对应的ID,一般都是直接返回position
public View getView(int position,View convertView,ViewGroup parent);
//获取每一行Item的显示内容。
// position:表示当前获取的Item是哪一行,开头从0开始
// convertView:旧视图复用,如果convertView不为空则表示可以用来复用.无需再次new一个view来使用.
// ViewGroup:只有LinearLayout或者RelativeLayout,如果viewGroup传入一个具体的对象,那么这个方法创建出来的view对象将作为这个viewGroup的childView来显示.
示例效果如下所示:
3.1写activity_main.xml
只是添加了一个ListView:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ListView
android:id="@+id/lv_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" >
</ListView>
</RelativeLayout>
4.2 写item.xml
用来显示每一项item的view视图
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/imageView1"
android:textSize="20sp"
android:textColor="#000000"
android:text="name" />
<TextView
android:id="@+id/tv_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/imageView1"
android:layout_alignLeft="@+id/tv_name"
android:text="content"
android:textColor="#88000000"
android:textSize="18sp" />
</RelativeLayout>
4.3 写MainActivity.java
package com.example.baseadaptertest;
import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
class Person {
String name;
String content;
public Person(String name,String content){
this.name = name;
this.content = content;
}
public String getName() {
return name;
}
public String getContent() {
return content;
}
}
public class MainActivity extends Activity {
ArrayList<Person> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.添加要显示的数据
list = new ArrayList<Person>();
list.add(new Person("张三","18岁 电话:158888666"));
list.add(new Person("李四","21岁 电话:158888777"));
list.add(new Person("王二","23岁 电话:158888877"));
list.add(new Person("孙武","25岁 电话:158888997"));
//2.设置Adapter
ListView lv_list = (ListView)findViewById(R.id.lv_list);
lv_list.setAdapter(new MyAdapter());
}
class MyAdapter extends BaseAdapter{
@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 = null;
//如果convertView为空则需要重新创建资源视图,如果不为空则表示可以用来复用.无需再次new一个view来使用.
if(convertView==null){
//通过R.layout.item 来创建一个item视图资源
view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item, null);
}else{
view = convertView;
}
//设置要显示的内容
TextView tv_name = (TextView)view.findViewById(R.id.tv_name);
TextView tv_content = (TextView)view.findViewById(R.id.tv_content);
tv_name.setText(list.get(position).getName());
tv_content.setText(list.get(position).getContent());
return view;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
5.使用ArrayAdapter适配器
ArrayAdapter数组适配器用于绑定格式单一的数据,每个item只有一个数据需要被修改,数据源可以是集合或者数组
并且ArrayAdapter可以直接用来使用,无需再继承此类来实现.
ArrayAdapter的构造方法常用的有两种:
public ArrayAdapter(Context context, int resource, T[] objects);
//第一个参数 上下文
//第二个参数 包含且只有一个textview的布局文件id
//第三个参数 要展示的数据数组
public ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects);
//第一个参数 上下文
//第二个参数 可以包含很多内容(ImageView、textview等)的布局文件id
//第三个参数 指向resource中要显示数据的一个textView控件id
//第三个参数 要展示的数据数组
接下来,我们使用第二种构造方法来演示.
效果如下:
5.1 写activity_main.xml
只是添加了一个ListView,内容和BaseAdapter的activity_main.xml一致
5.2 写item.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="horizontal" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="name"
android:textColor="#AA000000"
android:textSize="40sp" />
</LinearLayout>
5.3 写MainActivity.java
package com.example.arrayadapter;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//定义一个String数组
String[] objects = {"李白","姜子牙","李元芳","高渐离","后羿","王昭君","虞姬"};
//初始化ArrayAdapter
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.item, R.id.tv_content, objects);
//设置ArrayAdapter
ListView lv_list = (ListView)findViewById(R.id.lv_list);
lv_list.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
6.使用SimpleAdapter适配器
SimpleAdapter适配器适用于拥有多数据的item. 每个item通过Map集合来实现.而Map里则可以包含多个数据.
SimpleAdapter的构造方法如下所示:
public SimpleAdapter(Context context, List<? extends Map<String, ?>> data,
int resource, String[] from, int[] to);
//context: 上下文,填入getApplicationContext()即可
//data:包含了Map(String ,Object)的List数组,每个Map表示每个item数据。
//resource:要加载item的xml布局文件Id
//from:string数组, 用来标识一个item需要设置哪些key.而key对应的value则是要显示的数据
//to:int数组,填入item xml布局文件里的要更改的控件内容ID号 ,用来对应from中的key值,表示设置的key值最终是更改哪些控件内容
效果如下:
6.1 写activity_main.xml
只是添加了一个ListView,内容和BaseAdapter的activity_main.xml一致
6.2 写item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="60dp"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/imageView1"
android:textSize="17sp"
android:textColor="#000000"
android:text="name" />
<TextView
android:id="@+id/tv_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/imageView1"
android:layout_alignLeft="@+id/tv_title"
android:layout_alignParentRight="true"
android:layout_below="@+id/tv_title"
android:text="content"
android:textColor="#88000000"
android:textSize="15sp" />
</RelativeLayout>
6.3 写MainActivity.java
package com.example.simpleadapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List<Map<String, String>> data = new ArrayList<Map<String,String>>();
String[] from = {"title","content"};//用来标识一个item需要设置哪些key.而key对应的value则是要显示的数据,这里设置了2个key
int[] to={R.id.tv_title,R.id.tv_content}; //填入要更改的控件内容ID号 ,用来对应from中的两个key值,
//添加内容
Map<String, String> map1 = new HashMap<String, String>();
map1.put("title", "成都5.1级地震");
map1.put("content", "成都市青白江区5.1级地震尚无人员伤亡报告");
data.add(map1);
Map<String, String> map2 = new HashMap<String, String>();
map2.put("title", "英雄联盟手游即将上线");
map2.put("content", "期待已久的英雄联盟即将上线...");
data.add(map2);
Map<String, String> map3 = new HashMap<String, String>();
map3.put("title", "英语专四考试延期");
map3.put("content", "2020年英语专四专八考试延期...");
data.add(map3);
Map<String, String> map4 = new HashMap<String, String>();
map4.put("title", "上海出台减负政策");
map4.put("content", "上海发布抗疫企业减负政策 中小微企业:希望继续加大...");
data.add(map4);
Map<String, String> map5 = new HashMap<String, String>();
map5.put("title", "最硬核科蜜");
map5.put("content", "史上最硬核科蜜!穿着24号肩扛RPG伫立战火中...");
data.add(map5);
//初始化SimpleAdapter
SimpleAdapter adapter = new SimpleAdapter(getApplicationContext(), data, R.layout.item, from, to);
//设置SimpleAdapter
ListView lv_list = (ListView)findViewById(R.id.lv_list);
lv_list.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Ps:如果要设置Item点击事件,则通过下面方法设置即可
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//写要实现的事
}
});
Android BaseAdapter:在getView()重新输入时convertView null
我正在根据http://bartinger.at/listview-with-sectionsseparators/中描述的技术构建具有部分的ListView.但是我想通过重用convertView来扩展它来扩展它.但是,我发现每次输入getView()方法时convertView变量为null.有人可以解释为什么会这样吗?
ViewHolder holder;
final ListViewItem item = items.get(position);
if (item.isSection()) {
Section section = (Section)item;
convertView = inflater.inflate(R.layout.section, null);
TextView title = (TextView) convertView.findViewById(R.id.section_title);
title.setText(section.title);
} else {
if (convertView == null) {
Log.d("Adapter", "convertView was null");
}
Server server = (Server)item;
convertView = inflater.inflate(R.layout.server_row, null);
holder = new ViewHolder();
holder.serverName = (TextView) convertView.findViewById(R.id.server_name);
holder.serverStatusIcon = (ImageView)convertView.findViewById(R.id.server_status_icon);
convertView.setTag(holder);
holder.serverName.setText(server.name);
}
return convertView;
正在创建和显示列表而没有错误,并且包含部分和非部分项目就好了.
解决方法:
你正确实施吗
getItemViewType (int position) ?
从Android的文档中看到:
Returns
An integer representing the type of View. Two views should share the same type if one can be converted to the other in getView(int, View, ViewGroup). Note: Integers must be in the range 0 to getViewTypeCount() – 1. IGnorE_ITEM_VIEW_TYPE can also be returned.
所以也许convertView总是为null,因为适配器不知道哪些项属于一起,所以它不知道哪些项被传递回来…
试试这个:
@Override
public int getItemViewType(int position) {
if (((MyItem)getItem(position)).isHeader()) {
return 1;
} else {
return 0;
}
}
@Override
public int getViewTypeCount() {
return 2;
}
您在getItemViewType中返回的索引只是将标题和非标题组合在一起的标识符.
在这种情况下,您必须在模型项中实现方法“isHeader”(或类似).
Android ListView Adapter的getItemViewType和getViewTypeCount多种布局
《Android ListView Adapter的getItemViewType和getViewTypeCount多种布局》
在Android的ListView中,如果在一个ListView中要实现多种样式的ListView布局样式,则需要在ListView的适配器Adapter中用到:getItemViewType()和getViewTypeCount()。getViewTypeCount()告诉ListView需要加载多少种类型的Item View,getItemViewType()则告诉ListView在某一位置(position)的Item View样式是什么。
现给出一个示例加以,说明,本例简单的以字母A、B、C。。。作为数据分组,然后每个字母下有五个数据。
如图:
全部代码:
package zhangphil.listview;
import java.util.ArrayList;
import java.util.HashMap;
import android.app.ListActivity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends ListActivity {
// item view的类型总数。
private final int VIEW_TYPE_COUNT = 2;
private final String DATA = "data";
private final String TYPE = "type";
private final int GROUP = -2;
private final int ITEM = -3;
private ArrayList<HashMap<String, Object>> items = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ListView listView = this.getListView();
BaseAdapter adapter = new MyBaseAdapter();
items = new ArrayList<HashMap<String, Object>>();
listView.setAdapter(adapter);
// 假设我们演示以A,B,C,,,这样的字符串作为分组的标签。
// 每一组装载5个子数据。
String[] groups = { "A", "B", "C", "D", "E", "F" };
int count = 0;
for (int i = 0; i < groups.length; i++) {
HashMap<String, Object> group_map = new HashMap<String, Object>();
group_map.put(TYPE, GROUP);
group_map.put(DATA, groups[i]);
items.add(group_map);
for (int j = 0; j < 5; j++) {
HashMap<String, Object> data_map = new HashMap<String, Object>();
data_map.put(TYPE, ITEM);
data_map.put(DATA, "数据:" + (count++));
items.add(data_map);
}
}
}
private class MyBaseAdapter extends BaseAdapter {
private LayoutInflater inflater = null;
public MyBaseAdapter() {
inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int position) {
HashMap<String, Object> map = items.get(position);
return map.get(DATA);
}
// 返回的id可以自己定制。
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int type = getItemViewType(position);
// 根据不同的view type加载不同的布局文件。
switch (type) {
case GROUP:
convertView = inflater.inflate(
android.R.layout.simple_list_item_2, null);
TextView tv1 = (TextView) convertView
.findViewById(android.R.id.text1);
tv1.setText("分组");
tv1.setBackgroundColor(Color.RED);
TextView tv2 = (TextView) convertView
.findViewById(android.R.id.text2);
tv2.setText(getItem(position) + "");
tv2.setBackgroundColor(Color.GRAY);
break;
case ITEM:
convertView = inflater.inflate(
android.R.layout.simple_list_item_1, null);
TextView tv = (TextView) convertView
.findViewById(android.R.id.text1);
tv.setText(getItem(position) + "");
break;
}
return convertView;
}
// 解析view type。
// view type值是我们事先埋入到items数据集中的字段值。
// 注意!此处返回的值不要大于getViewTypeCount()的返回值。
@Override
public int getItemViewType(int position) {
HashMap<String, Object> map = items.get(position);
return (Integer) map.get(TYPE);
}
// 在本例中共计有2个不同类型的view
// android.R.layout.simple_list_item_1 和
// android.R.layout.simple_list_item_1.
@Override
public int getViewTypeCount() {
return VIEW_TYPE_COUNT;
}
}
}
Android ListView 和 BaseAdapter
1.<ListView
android:entries="@array/..."
android:divider="#ccc"/"图片"
android:dividerHeight="10dp"/>
2.class MyAdapter extends BaseAdapter {
private Context context;
private ArrayList<Bean> list;
public MyAdapter(Context context, ArrayList<Bean> list) {
this.context = context;
this.list = list;
}
public int getCount() {
return list.size()
}
public Object getItem(int postion) {
return list.get(postion);
}
public long getId(int postion) {
return postion;
}
public View getView(int postion, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if(convertView == null) {
convertView = LayoutInflater.from (context).inflate (R.layout.item_layout, null); // 第二个参数表示加到哪个父节点,跟生命周期有关
viewHolder = new ViewHolder();
viewHolder.name = covertView.findViewById(R.id.name);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder)convertView.getTag();
}
Bean bean = list.get(postion);
viewHolder.name.setText(bean.getName());
return convertView;
}
class ViewHolder {
TextView name;
}
}
3. lv.setOnItemClickListener(new onItemClickListener {
public void onItemClick(AdapterView<?> parent,View view,int postion,long id) {
parent.getItemAtPosition (postion) 为适配器中 getItem () 的返回值;
View 为适配器中 getView () 的返回值;
id 为适配器中 getItemId () 的返回值;
}
})
4.ListView 监听器 2:OnScrollListener
onScrollStateChanged(AbsListView view, int scrollState) {
//scrollState: SCROLL_STATE_TOUCH_SCROLL、SCROLL_STATE_FLING、SCROLL_STATE_IDLE (停止滑动)
}
onScroll(AbsListView view,int firstVisibleItem, int visbleItemCount, int totalItemCount) {}
5.lv.addHeaderView (布局或 view); // 放在绑定适配器之前可添加多个
lv.addFooterView(view);
lv.setEmptyView (view); //view 必须先存在 Listview 所在布局里,并 “gone”。
6.GridView (控件) 绑定适配器等与 Listview 相同,只是不能添加 HeaderView、FooterView.
<GridView
android:numColumns="2"
... />
今天关于android-Listview.setadapter引发nullpointer异常和android nullpointerexception的分享就到这里,希望大家有所收获,若想了解更多关于13.Android-ListView使用、BaseAdapter/ArrayAdapter/SimpleAdapter适配器使用、Android BaseAdapter:在getView()重新输入时convertView null、Android ListView Adapter的getItemViewType和getViewTypeCount多种布局、Android ListView 和 BaseAdapter等相关知识,可以在本站进行查询。
本文标签: