listview-ListView 上 NullPointerException onItemClick 异常

问题描述

ListView 上 NullPointerException onItemClick 异常

下面的代码我不能修复。
我创建了一个自定义的 ArrayAdapter,使用 TextViews 来填充 ListView 列表,包含 player 的名字。
当 player names 的整个列表都在实例 adapter 前指定,就能按预期的运行。
在实例化 adapter后,当我点击一个 list item 添加时,问题就出现了。
当我点击列表中第三个名是"Fries"的 player 时,我不清楚为什么在return mIdMap.get(item);行的PlayersArrayAdapter.getItemId(int position)里面获得一个NullPointerException 异常。
代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_match_settings);

    //arraylist to store players names
    ArrayList<String> playerNames = new ArrayList<String>();

    //players which are on the list from the begining
    //when I click on them, "onPlayerListItemClicked" is properly called
    //and I get clicked player name in my LogCat
    playerNames.add("Pawel");
    playerNames.add("Olga");

    //listview to display players names
    ListView playerListView = (ListView)findViewById(R.id.ms_player_list);

    //custom arrayadapter, which gets ArrayList as one of arguements
    PlayersArrayAdapter playerListAdapter = new PlayersArrayAdapter(this, R.layout.player_list_item, playerNames);  

    playerListView.setAdapter(playerListAdapter);
    playerListView.setOnItemClickListener(onPlayerListItemClicked);

    // THERE IS ROOT OF PROBLEM:
    // player "Fries" is also added to the ListView, and is properly displayed
    // but when I click on it, I get NullPointerException described above
    playerNames.add("Fries");
    playerListAdapter.notifyDataSetChanged();
}

OnItemClickListener onPlayerListItemClicked = new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, final View view, int position, long id) {
        String item = (String)parent.getItemAtPosition(position);
        Logger.i("Clicked at item: " + item);
    }
};

PlayersArrayAdapter class:

class PlayersArrayAdapter extends ArrayAdapter<String>{

    HashMap<String, Integer> mIdMap = new HashMap<String, Integer>();

    public PlayersArrayAdapter(Context context, int textViewResourceId, List<String> objects) {
        super(context, textViewResourceId, objects);

        for (int i = 0; i < objects.size(); i++)
            mIdMap.put(objects.get(i), i);
    }
    @Override
    public long getItemId(int position) {
        String item = getItem(position);
        return mIdMap.get(item); //at this line NullPointerException throws
    }
    @Override
    public boolean hasStableIds() {
        return true;
    }
}

Debug 的错误信息:

Thread [<1> main] (Suspended (exception NullPointerException))
    <VM does not provide monitor information>
    PlayersArrayAdapter.getItemId(int) line: 119
    AbsListView$PerformClick.run() line: 1964
    ViewRoot(Handler).handleCallback(Message) line: 587
    ViewRoot(Handler).dispatchMessage(Message) line: 92
    Looper.loop() line: 130
    ActivityThread.main(String[]) line: 3687
    Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
    Method.invoke(Object, Object...) line: 507
    ZygoteInit$MethodAndArgsCaller.run() line: 867
    ZygoteInit.main(String[]) line: 625
    NativeStart.main(String[]) line: not available [native

解决方案

getItemId的调用的方法实际上不就是返回position吗,何必倒过来倒回去

时间: 2024-10-29 10:15:45

listview-ListView 上 NullPointerException onItemClick 异常的相关文章

listview表头上怎么增加下拉,选择过滤条件?怎么把combo控件添加到表头?

问题描述 listview表头上怎么增加下拉,选择过滤条件?怎么把combo控件添加到表头? listview表头上怎么增加下拉,选择过滤条件?怎么把combo控件添加到表头? 解决方案 Duilib list表头增加增加控件

ListView组件上实现下拉刷新效果

问题描述 请教大虾如何在ListView组件上实现下拉刷新效果,在网上查的的添加一个头文件即用addHeader()方法,然后使用setSelection(1)在平时隐藏掉头文件,有响应事件时再显示头文件,但是当ListView里的选项很少时头文件是隐藏不掉的,请问有别的处理方法吗.要求完全隐藏掉下拉刷新的组件. 问题补充:xchhj_292 写道 解决方案 This project aims to provide a reusable pull to refresh widget for An

当ListView有Header时 onItemClick里的position不正确的原因

当ListView实例addheaderView()或者addFooterView后,再通过setAdapter来添加适配器,此时在ListView实例变量里保存的适配器变量与我们传入的适配器变量不是同一个了.具体可参考源码: 因此,当有headerView或footerView的时候,要通过getAdapter()获取到适配器,而不是直接使用调用setAdapter是传入的入参. 以上所述是小编给大家介绍的当ListView有Header时 onItemClick里的position不正确的原

android开发银联支付在小米4c上直接ANR异常,别的手机没事,什么原因???

问题描述 android开发银联支付在小米4c上直接ANR异常,别的手机没事,什么原因??? android银联支付,点击调起银联,在别的手机上运行正常,在小米4c上直接ANR异常,什么原因??? 解决方案 http://jingyan.baidu.com/article/b2c186c8e49428c46ff6ff43.html

jquery.form ajaxt-jquery.form 上传文件异常errorThrown server abort

问题描述 jquery.form 上传文件异常errorThrown server abort var updateTh = function (){ var options={ url:'${ctx}/Controller/importData', type:'post', dataType :"json", success:function(data){ alert(data.respCode); }, error:function (XMLHttpRequest,textStat

Android ListView实现上拉加载下拉刷新和滑动删除功能_Android

最近项目需要用到可以滑动删除并且带有上拉加载下拉刷新的Listview,查阅了一些资料,大多都是在SwipeMenuListView的基础上去添加头部和底部View,来扩展上拉加载和下拉刷新的功能,不过需要手动的去绘制UI及处理一些动画效果.用起来也不是特别方便.刚好项目中用到PulltorefreshLibrary库,就尝试着扩展了一个PullToRefreshSwipeMenuListView类来实现需求.先看一下效果: 实现步骤 一.组合Pulltorefresh与SwipeMenuLis

Android ListView实现上拉加载下拉刷新和滑动删除功能

最近项目需要用到可以滑动删除并且带有上拉加载下拉刷新的Listview,查阅了一些资料,大多都是在SwipeMenuListView的基础上去添加头部和底部View,来扩展上拉加载和下拉刷新的功能,不过需要手动的去绘制UI及处理一些动画效果.用起来也不是特别方便.刚好项目中用到PulltorefreshLibrary库,就尝试着扩展了一个PullToRefreshSwipeMenuListView类来实现需求.先看一下效果: 实现步骤 一.组合Pulltorefresh与SwipeMenuLis

Android ListView实现上拉加载更多和下拉刷新功能_Android

本文实例为大家介绍了Android ListView下拉刷新功能的实现方法和功能,供大家参考,具体内容如下 1.ListView优化方式 界面缓存:ViewHolder+convertView分页加载:上拉刷新图片缓存快速滑动ListView禁止刷新 2.效果 3.上拉加载更多原理及实现 当我们手指滑动到listview最后位置的时候,我们触发加载数据的方法.这触发之前我们需要做一些工作,包括: 如何判断滑动到最后? 如何避免重复加载数据? 加载之后如何刷新界面? 1).界面实现AbsListV

Android ListView实现上拉加载更多和下拉刷新功能

本文实例为大家介绍了Android ListView下拉刷新功能的实现方法和功能,供大家参考,具体内容如下 1.ListView优化方式 界面缓存:ViewHolder+convertView 分页加载:上拉刷新 图片缓存 快速滑动ListView禁止刷新 2.效果 3.上拉加载更多原理及实现 当我们手指滑动到listview最后位置的时候,我们触发加载数据的方法.这触发之前我们需要做一些工作,包括: 如何判断滑动到最后? 如何避免重复加载数据? 加载之后如何刷新界面? 1).界面实现AbsLi