Android 我寻找这个空指针异常是因为带有微调器的getTag,已经有一段时间了
几天来,我一直想实现一个包含微调器的ListView。我对android真的很陌生,所以从一个论坛到另一个论坛,我设法让一些东西工作起来。 我唯一的问题是,在我的真实设备上向下滚动时,微调器的值丢失或行为异常(有时会重置,有时最后一个元素会取第一个元素的值..等等) 当我读到这篇文章时,我发现android会回收视图,所以我尝试使用这个概念。 请你告诉我正确的方法,或者告诉我我做错了什么。 我得到的错误如下: 04-27 19:43:09.649:E/AndroidRuntime(7530):java.lang.NullPointerException 04-27 19:43:09.649:E/AndroidRuntime(7530):在com.example.mysqlconnection.mycustomarrayadapter.getView(mycustomarrayadapter.java:106) 其中,第106行对应于: holder.Spin.setSelection((整数)(holder.Spin.getTag()) 多谢各位 list_item.xml android:orientation=“horizontal”>Android 我寻找这个空指针异常是因为带有微调器的getTag,已经有一段时间了,android,Android,几天来,我一直想实现一个包含微调器的ListView。我对android真的很陌生,所以从一个论坛到另一个论坛,我设法让一些东西工作起来。 我唯一的问题是,在我的真实设备上向下滚动时,微调器的值丢失或行为异常(有时会重置,有时最后一个元素会取第一个元素的值..等等) 当我读到这篇文章时,我发现android会回收视图,所以我尝试使用这个概念。 请你告诉我正确的方法,或者告诉我我做错了什么。 我得到的错误如下: 04-27 19:43:09.649:E/AndroidRuntime(7530):j
公共类MyCustomArrayAdapter扩展了ArrayAdapter>{
private static final String TAG_PID = "EnfantId";
private static final String TAG_NOM = "Prenom";
HashMap<String, String> hm = new HashMap<String, String>();
SpinnerContent data[] = null;
int[] anArray;
Context context;
int layoutResourceId;
ArrayList<HashMap<String, String>> localList;
LayoutInflater inflater;
public MyCustomeArrayAdapter(Context pContext, int layoutResourceId, ArrayList<HashMap<String, String>> list) {
super(pContext, layoutResourceId, list);
this.context = pContext;
this.layoutResourceId = layoutResourceId;
this.localList = new ArrayList<HashMap<String, String>>();
this.localList.addAll(list);
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
data = new SpinnerContent[20];
anArray = new int[20];
}
private static final String TAG_PID=“EnfantId”;
私有静态最终字符串标记_NOM=“Prenom”;
HashMap hm=新的HashMap();
喷丝板内容数据[]=null;
国际[]无秩序;
语境;
国际布局资源;
arraylistlocallist;
充气机;
公共MyCustomerRayaAdapter(上下文pContext、内部布局资源ID、数组列表){
super(pContext、layoutResourceId、list);
this.context=pContext;
this.layoutResourceId=layoutResourceId;
this.localList=new ArrayList();
this.localList.addAll(list);
充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
数据=新喷丝板含量[20];
anArray=新整数[20];
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
查看行=null;
最终喷丝头支架;
if(convertView==null)
{
行=充气机。充气(布局资源ID,空);
保持架=新喷丝头保持架();
holder.name=(TextView)row.findViewById(R.id.name);
holder.pid=(TextView)row.findViewById(R.id.pid);
holder.Spin=(微调器)row.findViewById(R.id.presence);
holder.Spin.setOnItemSelectedListener(新的OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、View selectedItemView、int SpinPosition、长id){
保持架.旋转.设置标签(旋转位置);
}
@凌驾
未选择公共无效(AdapterView arg0){
//TODO自动生成的方法存根
}
});
row.setTag(支架);
}
其他的
{
行=转换视图;
holder=(喷丝头holder)行。getTag();
}
hm=localList.get(位置);
holder.pid.setText(hm.get(TAG_pid));
holder.name.setText(hm.get(TAG_NOM));
holder.Spin.setSelection((整数)(holder.Spin.getTag());
返回行;
}
私家级喷丝板架
{
文本视图名称;
文本视图pid;
旋转器旋转;
}
}旋转标记没有默认值。可以将视图保存在地图中,并为每个位置创建唯一视图,而不是循环使用其他视图
//member vairous
Map mViews = new HashMap<Integer, View>();
@Override public View getView(final int position, View convertView, ViewGroup parent){
View view = mViews.get(position);
if(view == null)
{
view = inflater.inflate(layoutResourceId, null);
holder = new SpinnerHolder();
holder.name = (TextView)view.findViewById(R.id.name);
holder.pid = (TextView)view.findViewById(R.id.pid);
holder.Spin = (Spinner)view.findViewById(R.id.presence);
//set the default value.
holder.Spin.setTag(0);
holder.Spin.setOnItemSelectedListener(new OnItemSelectedListener(){
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int SpinPosition, long id) {
holder.Spin.setTag(SpinPosition);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
view.setTag(holder);
mViwes.put(position, view);
}
else
{
holder = (SpinnerHolder)view.getTag();
}
hm = localList.get(position);
holder.pid.setText(hm.get(TAG_PID));
holder.name.setText(hm.get(TAG_NOM));
holder.Spin.setSelection((Integer) (holder.Spin.getTag()));
return view;
}
//成员
Map mViews=newhashmap();
@覆盖公共视图getView(最终整数位置、视图转换视图、视图组父视图){
View=mViews.get(位置);
如果(视图==null)
{
视图=充气机。充气(布局资源ID,null);
保持架=新喷丝头保持架();
holder.name=(TextView)view.findViewById(R.id.name);
holder.pid=(TextView)view.findViewById(R.id.pid);
holder.Spin=(微调器)view.findViewById(R.id.presence);
//设置默认值。
保持器旋转设置标签(0);
holder.Spin.setOnItemSelectedListener(新的OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、View selectedItemView、int SpinPosition、长id){
保持架.旋转.设置标签(旋转位置);
}
@凌驾
未选择公共无效(AdapterView arg0){
//TODO自动生成的方法存根
}
});
视图.设置标签(支架);
mViwes.put(位置、视图);
}
其他的
{
holder=(SpinnerHolder)视图.getTag();
}
hm=localList.get(位置);
holder.pid.setText(hm.get(TAG_pid));
holder.name.setText(hm.get(TAG_NOM));
holder.Spin.setSelection((整数)(holder.Spin.getTag());
返回视图;
}
我终于通过搜索web找到了解决方案:
我在构造函数中声明了一个hashmap,如下所示:
HashMap(Integer,Integer>selectedItems=newhashmap(Integer,Integer>()
然后我更改了getView()方法,如下所示:
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
//视图行=super.getView(位置、转换视图、父级);
视图行=充气机。充气(布局资源ID,null);
hm=localList.get(位置);
((TextView)row.findviewbyd(R.id.name)).setText(hm.get(TAG_NOM));
((TextView)row.findviewbyd(R.id.pid)).setText(hm.get(TAG_-pid));
if(selectedItems.get(位置)!=null)
{
((微调器)row.findviewbyd(R.id.presence)).setSelection(selectedItems.get(position));
}
((微调器)row.findViewById(R.id.presence)).setOnItemSelectedListener(新的OnItemSelectedListener(){
@凌驾
公共voi
View row = null;
final SpinnerHolder holder;
if(convertView == null)
{
row = inflater.inflate(layoutResourceId, null);
holder = new SpinnerHolder();
holder.name = (TextView)row.findViewById(R.id.name);
holder.pid = (TextView)row.findViewById(R.id.pid);
holder.Spin = (Spinner)row.findViewById(R.id.presence);
holder.Spin.setOnItemSelectedListener(new OnItemSelectedListener(){
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int SpinPosition, long id) {
holder.Spin.setTag(SpinPosition);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
row.setTag(holder);
}
else
{
row = convertView;
holder = (SpinnerHolder)row.getTag();
}
hm = localList.get(position);
holder.pid.setText(hm.get(TAG_PID));
holder.name.setText(hm.get(TAG_NOM));
holder.Spin.setSelection((Integer) (holder.Spin.getTag()));
return row;
}
private class SpinnerHolder
{
TextView name;
TextView pid;
Spinner Spin;
}
//member vairous
Map mViews = new HashMap<Integer, View>();
@Override public View getView(final int position, View convertView, ViewGroup parent){
View view = mViews.get(position);
if(view == null)
{
view = inflater.inflate(layoutResourceId, null);
holder = new SpinnerHolder();
holder.name = (TextView)view.findViewById(R.id.name);
holder.pid = (TextView)view.findViewById(R.id.pid);
holder.Spin = (Spinner)view.findViewById(R.id.presence);
//set the default value.
holder.Spin.setTag(0);
holder.Spin.setOnItemSelectedListener(new OnItemSelectedListener(){
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int SpinPosition, long id) {
holder.Spin.setTag(SpinPosition);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
view.setTag(holder);
mViwes.put(position, view);
}
else
{
holder = (SpinnerHolder)view.getTag();
}
hm = localList.get(position);
holder.pid.setText(hm.get(TAG_PID));
holder.name.setText(hm.get(TAG_NOM));
holder.Spin.setSelection((Integer) (holder.Spin.getTag()));
return view;
}
// View row = super.getView(position, convertView, parent);
View row = inflater.inflate(layoutResourceId, null);
hm = localList.get(position);
((TextView)row.findViewById(R.id.name)).setText(hm.get(TAG_NOM));
((TextView)row.findViewById(R.id.pid)).setText(hm.get(TAG_PID));
if (selectedItems.get(position) != null)
{
((Spinner)row.findViewById(R.id.presence)).setSelection(selectedItems.get(position));
}
((Spinner)row.findViewById(R.id.presence)).setOnItemSelectedListener(new OnItemSelectedListener(){
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int SpinPosition, long id) {
selectedItems.put(position, SpinPosition);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
return row;
}