zxd_72 2013-09-10 06:51 采纳率: 0%
浏览 2422

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 
  • 写回答

1条回答

  • kity 2013-09-10 07:08
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮