最后一行交互时,Android ListView索引会发生变化

时间:2013-06-07 06:47:46

标签: android listview

尝试构建一种结果跟踪器我遇到了这个问题;

我有一个自定义列表视图(带有标题),每个玩家都会获得一行。在这一行中有一个TextView for name和一个EditText用于抛出的数量(以及其他)。

在模拟器上运行时,一切运行正常。

在手机上运行而不更改任何值时,一切运行正常。

当在手机上运行并在ListView的最后一行中报告值时,代码会跳过第一项,从而在尝试查找最后一行时获得空指针异常。

通过此方法报告结果:

    private void reportResults(ListView listViewPlayers, ArrayList<HoleResultInfo> holeResult_data, TextView tvPar, Integer hole){
    //Skapar arrya ifrån antalet spelare i tabellen, justerar för header 
    System.out.println("gui hol Collecting hole results");
    System.out.println("gui hol number of items in listview: " + listViewPlayers.getCount());

    HoleResultInfo tempHoleResult;
    for (int i = 0; i < listViewPlayers.getCount()-1; i++) {
        tempHoleResult = holeResult_data.get(i);
        //Starts at 1 to skip header
        View rowView = listViewPlayers.getChildAt(i+1);
        System.out.println("gui hol At i: " + i + " looking for child: " + (i + 1));
        System.out.println("gui hol HoleResult name: " + holeResult_data.get(i).getName());
        TextView tvName = (TextView)rowView.findViewById(R.id.tvPlayerName);
        System.out.println("gui hol Textview name: " + tvName.getText().toString());
            tempHoleResult.setName(tvName.getText().toString());
        EditText etOb = (EditText)rowView.findViewById(R.id.etPlayerOb);
            tempHoleResult.setOb(Integer.parseInt(etOb.getText().toString()));
        EditText etTrows = (EditText)rowView.findViewById(R.id.etPlayerTrows);
            tempHoleResult.setTrows(Integer.parseInt(etTrows.getText().toString()));

        holeResult_data.set(i, tempHoleResult);
    }

logcat的输出(有三个玩家:Otto,Teddy和Test)在模拟器中如下所示,而不是报告:

gui hol Collecting hole results
gui hol number of items in listview: 4
gui hol At i: 0 looking for child: 1
gui hol HoleResult name: Otto
gui hol Textview name: Otto
gui hol At i: 1 looking for child: 2
gui hol HoleResult name: Teddy
gui hol Textview name: Teddy
gui hol At i: 2 looking for child: 3
gui hol HoleResult name: Test
gui hol Textview name: Test

这是不工作时的输出:

gui hol Collecting hole results 
gui hol number of items in listview: 4
gui hol At i: 0 looking for child: 1
gui hol HoleResult name: Otto
gui hol Textview name: Teddy
gui hol At i: 1 looking for child: 2
gui hol HoleResult name: Teddy
gui hol Textview name: Test
gui hol At i: 2 looking for child: 3
gui hol HoleResult name: Test
D/AndroidRuntime(15847): Shutting down VM
W/dalvikvm(15847): threadid=1: thread exiting with uncaught exception (group=0x41541318)
E/AndroidRuntime(15847): FATAL EXCEPTION: main
E/AndroidRuntime(15847): java.lang.NullPointerException
at frisbeegolf.gui.Hole.reportResults(Hole.java:141)
at frisbeegolf.gui.Hole.access$0(Hole.java:129)
at frisbeegolf.gui.Hole$1.onClick(Hole.java:69)
at android.view.View.performClick(View.java:4103)
at android.view.View$PerformClick.run(View.java:17117)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)

第141行是:TextView tvName =(TextView)rowView.findViewById(R.id.tvPlayerName);

请帮助,我完全没有想法,为此疯狂!

/ O

1 个答案:

答案 0 :(得分:0)

方法getChildAt()启用可见视图

View rowView = listViewPlayers.getChildAt(i+1); 

您应该更改数据列表上的数据,例如ArrayList,然后通过从列表适配器调用notifydataSetChange方法来通知ListView

adapter.notifyDataSetChange();

您的适配器应该通过调用方法getView来更改可见单元格中的所有数据,但它没有附加在您的问题中