Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ArrayAdapter为每行调用getView五次,并产生意外行为_Android_Android Adapter_Android Adapterview - Fatal编程技术网

Android ArrayAdapter为每行调用getView五次,并产生意外行为

Android ArrayAdapter为每行调用getView五次,并产生意外行为,android,android-adapter,android-adapterview,Android,Android Adapter,Android Adapterview,在我的应用程序中,用户将从各个团队中选择玩家。在屏幕顶部有一个计数,显示所选球员的总数,在每一队行上有一个计数,显示从该队中选择的球员的总数 我正面临ArrayAdapter的意外行为 问题:- 为什么对数组列表中的每个元素调用了五次getView()方法 只有一次玩家计数(团队行)更新有效,之后玩家计数无效 当我选择展开团队,然后在团队行上计数并重置 代码: activity_main.xml <RelativeLayout xmlns:android="http://schemas

在我的应用程序中,用户将从各个团队中选择玩家。在屏幕顶部有一个计数,显示所选球员的总数,在每一队行上有一个计数,显示从该队中选择的球员的总数

我正面临
ArrayAdapter
的意外行为

问题:-

  • 为什么对数组列表中的每个元素调用了五次
    getView()
    方法
  • 只有一次玩家计数(团队行)更新有效,之后玩家计数无效
  • 当我选择展开团队,然后在团队行上计数并重置
代码:

activity_main.xml

<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" >

<LinearLayout
    android:id="@+id/lLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#fa8765"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    android:padding="15dp" >

    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="left"
        android:text="@string/selected" />

    <TextView
        android:id="@+id/tViewNoOfSelectionOnTop"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="right"
        android:textStyle="bold"
        android:text="0" />
</LinearLayout>

<ListView
    android:id="@+id/lView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/lLayout" >
</ListView>
日志:-

04-13 10:15:22.948: I/System.out(2761): Row Count(Position): 0, pos: 0, Row Count2: 1
04-13 10:15:22.949: I/System.out(2761): Type Team
04-13 10:15:22.949: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:22.949: I/System.out(2761): Row Count(Position): 1, pos: 1, Row Count2: 2
04-13 10:15:22.949: I/System.out(2761): Type Team
04-13 10:15:22.949: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:22.949: I/System.out(2761): Row Count(Position): 2, pos: 2, Row Count2: 3
04-13 10:15:22.951: I/System.out(2761): Type Team
04-13 10:15:22.951: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:23.013: W/EGL_emulation(2761): eglSurfaceAttrib not implemented
04-13 10:15:23.013: W/OpenGLRenderer(2761): Failed to set EGL_SWAP_BEHAVIOR on surface 0xa5e45da0, error=EGL_SUCCESS
04-13 10:15:23.087: I/System.out(2761): Row Count(Position): 0, pos: 0, Row Count2: 4
04-13 10:15:23.087: I/System.out(2761): Type Team
04-13 10:15:23.088: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:23.088: I/System.out(2761): Row Count(Position): 1, pos: 1, Row Count2: 5
04-13 10:15:23.088: I/System.out(2761): Type Team
04-13 10:15:23.088: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:23.088: I/System.out(2761): Row Count(Position): 2, pos: 2, Row Count2: 6
04-13 10:15:23.088: I/System.out(2761): Type Team
04-13 10:15:23.088: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:23.089: I/System.out(2761): Row Count(Position): 0, pos: 0, Row Count2: 7
04-13 10:15:23.090: I/System.out(2761): Type Team
04-13 10:15:23.090: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:23.090: I/System.out(2761): Row Count(Position): 1, pos: 1, Row Count2: 8
04-13 10:15:23.090: I/System.out(2761): Type Team
04-13 10:15:23.090: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:23.090: I/System.out(2761): Row Count(Position): 2, pos: 2, Row Count2: 9
04-13 10:15:23.091: I/System.out(2761): Type Team
04-13 10:15:23.091: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:23.092: I/System.out(2761): Row Count(Position): 0, pos: 0, Row Count2: 10
04-13 10:15:23.092: I/System.out(2761): Type Team
04-13 10:15:23.093: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:23.093: I/System.out(2761): Row Count(Position): 1, pos: 1, Row Count2: 11
04-13 10:15:23.093: I/System.out(2761): Type Team
04-13 10:15:23.093: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:23.093: I/System.out(2761): Row Count(Position): 2, pos: 2, Row Count2: 12
04-13 10:15:23.093: I/System.out(2761): Type Team
04-13 10:15:23.093: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:23.148: I/System.out(2761): Row Count(Position): 0, pos: 0, Row Count2: 13
04-13 10:15:23.148: I/System.out(2761): Type Team
04-13 10:15:23.148: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:23.148: I/System.out(2761): Row Count(Position): 1, pos: 1, Row Count2: 14
04-13 10:15:23.149: I/System.out(2761): Type Team
04-13 10:15:23.149: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:23.149: I/System.out(2761): Row Count(Position): 2, pos: 2, Row Count2: 15
04-13 10:15:23.149: I/System.out(2761): Type Team
04-13 10:15:23.149: I/System.out(2761): TextView Id: 2131099654

适配器的
getView()
与活动的
onCreate()
不同
onCreate()
在活动的生命周期中只调用一次,但是每次显示
ListView
中的列表项时都调用
getView()
。 如果列表项由于上下滚动或其他原因被隐藏,并且再次显示,则调用
getView()
。因此,最好将数据保存在另一个地方


在代码中,
getView()
中的
rowCount++
将无法正常工作。如果要对
列表视图进行计数
,请使用
Adapter.getCount()

我想,你应该制作一个列表视图,其中球队是父母,球员是孩子

机器人工程师罗曼圭

这不是一个问题,在订单上绝对没有保证 将调用哪个getView()或调用多少次

我了解到,由于分配了这些
layout\u height=“wrap\u content”
适配器会输入许多时间来计算特定高度

您需要将
layout\u height=“match\u parent”
放在
ListView
中以避免这种行为

附笔。 我在您的代码中有一些观察结果:

  • 为什么使用
    ListView
    而不是
    ExpandableListView
    ?这是一个更好的选择
  • 如果您将使用ListView,那么实现保持器模式是一个很好的实践
  • 不要在实体bean中实现视图行为。这将及时生成不受支持的代码
  • child.xml
    中,最好使用
    复选框,而不是
    ImageView
    。只需更改复选框视图样式

我用你的代码重构它,你可以在我的GitHub上检查这是真的,如果没有隐藏的数据,列表的内容将在一个短时间内进入屏幕,甚至它将进入屏幕的一半,那么为什么getView()方法每行调用五次呢。假设数据不适合一个简短的语句,那么在这种情况下,getView()方法只需为一行调用一次。但它调用的方法不止一个。@VinitVikash我犯了一个错误,我编辑了答案,请检查please@Cesardl...Thanks伙计…我从github下载了代码。。没有变化。问题还在那里。只有在第一次更新团队计数之后,它才起作用。只有团队类存在,并且此调用具有团队数组,团队名称将作为球员名称。忘记我在代码中提到的Player类吧。Hi@VinitVikash我上传了最后一次提交到GitHub。我想这对你来说很有趣。嗨@Cesardl。。。谢谢你,伙计。。。您已经通过可扩展列表视图更改了ArrayAdapter,并且很好地解释了代码。。。再次感谢你。。。但有一个问题。。。我们不能通过使用ArrayAdapter来实现这一点?我错在哪里?我将父文本视图的引用存储在父类中,并在检查或取消检查子类时进行更新。为什么第一次文本视图更新而不是第二次更新。我没有犯任何错误,那么为什么代码不能按预期工作呢?
<?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="wrap_content"
android:background="#f1fbf2"
android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="8dp" >

<TextView
    android:id="@+id/tViewPlayerName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:text="Player Name" />

<ImageView
    android:id="@+id/iViewCheckUnCheck"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:src="@drawable/un_mark" />
</RelativeLayout>
public class MainActivity extends Activity {
private Context context;
private ListView lView;
private ArrayAdapter<Team> aAdapterTeam;
private List<Team> listTeam;
private TextView tViewNoOfSelectionOnTop;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    context = MainActivity.this;

    tViewNoOfSelectionOnTop = (TextView) findViewById(R.id.tViewNoOfSelectionOnTop);
    lView = (ListView) findViewById(R.id.lView);
    listTeam = new ArrayList<Team>();
    loadData();

    aAdapterTeam = new TeamAdapter(context, 0, listTeam, tViewNoOfSelectionOnTop);

    lView.setAdapter(aAdapterTeam);
}

private void loadData() {
    Team team = new Team("Team A", 0);
    Team[] teamPlayers = new Team[5];
    teamPlayers[0] = new Team("Player A1", 1, team);
    teamPlayers[1] = new Team("Player A2", 1, team);
    teamPlayers[2] = new Team("Player A3", 1, team);
    teamPlayers[3] = new Team("Player A4", 1, team);
    teamPlayers[4] = new Team("Player A5", 1, team);
    team.addPlayers(teamPlayers);
    listTeam.add(team);

    team = new Team("Team B", 0);
    teamPlayers = new Team[4];
    teamPlayers[0] = new Team("Player B1", 1, team);
    teamPlayers[1] = new Team("Player B2", 1, team);
    teamPlayers[2] = new Team("Player B3", 1, team);
    teamPlayers[3] = new Team("Player B4", 1, team);
    team.addPlayers(teamPlayers);
    listTeam.add(team);

    team = new Team("Team C", 0);
    teamPlayers = new Team[3];
    teamPlayers[0] = new Team("Player C1", 1, team);
    teamPlayers[1] = new Team("Player C2", 1, team);
    teamPlayers[2] = new Team("Player C3", 1, team);
    team.addPlayers(teamPlayers);
    listTeam.add(team);
}
}
public class TeamAdapter extends ArrayAdapter<Team>{
private Context context;
private int resourceId;
private List<Team> listTeam;
private TextView tViewNoOfSelectionOnTop;
private int countSelectionOnTop = 0;
//  private int pos = 0;
//  private Team rowData = null;
private TextView tViewNoOfSelectionFrmPatent = null;
private int rowCount = 0;

public TeamAdapter(Context context, int resourceId,
        List<Team> teams, TextView tViewNoOfSelection) {
    super(context, resourceId, teams);
    this.context = context;
    this.resourceId = resourceId;
    this.listTeam = teams;
    this.tViewNoOfSelectionOnTop = tViewNoOfSelection;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    rowCount++;

    final int pos = position;
    final Team rowData = listTeam.get(pos);
//      pos = position;
//      rowData = listTeam.get(pos);
    System.out.println("Row Count(Position): " + position + ", pos: " + pos + ", Row Count2: " + rowCount);

    LayoutInflater inflater = ((Activity) context).getLayoutInflater();
    if (rowData.getType() == Team.TYPE_Team) {
        convertView = inflater.inflate(R.layout.parent, parent, false);
    } else if (rowData.getType() == Team.TYPE_Player) {
        convertView = inflater.inflate(R.layout.child, parent, false);
    }

    if (rowData.getType() == Team.TYPE_Team) {
        System.out.println("Type Team");
        TextView tViewTeamName = (TextView) convertView.findViewById(R.id.tViewTeamName);
        TextView tViewNoOfSelectionFrmPatent = (TextView) convertView.findViewById(R.id.tViewNoOfSelectionFrmPatent);

        tViewTeamName.setText(rowData.getStrName());
        rowData.settViewNoOfSelectionFrmPatent(tViewNoOfSelectionFrmPatent);
        convertView.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                rowData.toggleExpansion(TeamAdapter.this, pos);
            }
        });

    } else if (rowData.getType() == Team.TYPE_Player) {
        System.out.println("Type Player");
        final ImageView iViewCheckUnCheck = (ImageView) convertView.findViewById(R.id.iViewCheckUnCheck);
        TextView tViewPlayerName = (TextView) convertView.findViewById(R.id.tViewPlayerName);
        tViewNoOfSelectionFrmPatent = rowData.getParent().gettViewNoOfSelectionFrmPatent();
        System.out.println("TextView2 Id: " + tViewNoOfSelectionFrmPatent.getId());
        tViewPlayerName.setText(rowData.getStrName());

        if (rowData.isSelected()) iViewCheckUnCheck.setImageResource(R.drawable.mark);
        else iViewCheckUnCheck.setImageResource(R.drawable.un_mark);

        convertView.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                System.out.println("Player Clicked");
                rowData.toggleSelection();
                int a = Integer.valueOf(tViewNoOfSelectionFrmPatent.getText().toString());
                if (rowData.isSelected()) {
                    System.out.println("Player Selected");
                    a++;
                    countSelectionOnTop++;
                    iViewCheckUnCheck.setImageResource(R.drawable.mark);
                } else {
                    System.out.println("Player Unselected");
                    a--;
                    countSelectionOnTop--;
                    iViewCheckUnCheck.setImageResource(R.drawable.un_mark);
                }
                tViewNoOfSelectionOnTop.setText(String.valueOf(countSelectionOnTop));
                tViewNoOfSelectionFrmPatent.setText(String.valueOf(a));
            }
        });
    }
    return convertView;
}
}
public class Team {
public static final int TYPE_Team = 0;
public static final int TYPE_Player = 1;

private String strName;
private boolean isSelected;
private Team[] players;
private Team parent;
private int type;
private boolean isExpanded = false;
private TextView tViewNoOfSelectionFrmPatent;


public Team(String strName, int type) {
    super();
    this.strName = strName;
    this.type = type;
}

public Team(String strName, int type, Team parent) {
    super();
    this.strName = strName;
    this.type = type;
    this.parent = parent;
}

public void toggleExpansion(TeamAdapter teamAdapter, int pos) {
    isExpanded = !isExpanded;
    if (isExpanded) {
        for (Team player : players) {
            pos++;
            teamAdapter.insert(player, pos);
        }
    } else {
        for (Team player : players) {
            teamAdapter.remove(player);
        }
    }
}

public void toggleSelection() {
    isSelected = !isSelected;
    /*for (Team player : parent.getPlayers()) {
        if (player.isSelected) {
            parent.isSelected = true;
        }
    }*/
}

public boolean hasChildren() {
    return players != null;
}

public void addPlayers(Team[] players){
    this.players = players;
}

private Team[] getPlayers(){
    return players;
}

public String getStrName() {
    return strName;
}

public boolean isSelected() {
    return isSelected;
}

public Team getParent() {
    return parent;
}

public void setParent(Team parent) {
    this.parent = parent;
}

public int getType() {
    return type;
}

public TextView gettViewNoOfSelectionFrmPatent() {
    return tViewNoOfSelectionFrmPatent;
}

public void settViewNoOfSelectionFrmPatent(
        TextView tViewNoOfSelectionFrmPatent) {
    System.out.println("TextView Id: " + tViewNoOfSelectionFrmPatent.getId());
    this.tViewNoOfSelectionFrmPatent = tViewNoOfSelectionFrmPatent;
}
}
04-13 10:15:22.948: I/System.out(2761): Row Count(Position): 0, pos: 0, Row Count2: 1
04-13 10:15:22.949: I/System.out(2761): Type Team
04-13 10:15:22.949: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:22.949: I/System.out(2761): Row Count(Position): 1, pos: 1, Row Count2: 2
04-13 10:15:22.949: I/System.out(2761): Type Team
04-13 10:15:22.949: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:22.949: I/System.out(2761): Row Count(Position): 2, pos: 2, Row Count2: 3
04-13 10:15:22.951: I/System.out(2761): Type Team
04-13 10:15:22.951: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:23.013: W/EGL_emulation(2761): eglSurfaceAttrib not implemented
04-13 10:15:23.013: W/OpenGLRenderer(2761): Failed to set EGL_SWAP_BEHAVIOR on surface 0xa5e45da0, error=EGL_SUCCESS
04-13 10:15:23.087: I/System.out(2761): Row Count(Position): 0, pos: 0, Row Count2: 4
04-13 10:15:23.087: I/System.out(2761): Type Team
04-13 10:15:23.088: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:23.088: I/System.out(2761): Row Count(Position): 1, pos: 1, Row Count2: 5
04-13 10:15:23.088: I/System.out(2761): Type Team
04-13 10:15:23.088: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:23.088: I/System.out(2761): Row Count(Position): 2, pos: 2, Row Count2: 6
04-13 10:15:23.088: I/System.out(2761): Type Team
04-13 10:15:23.088: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:23.089: I/System.out(2761): Row Count(Position): 0, pos: 0, Row Count2: 7
04-13 10:15:23.090: I/System.out(2761): Type Team
04-13 10:15:23.090: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:23.090: I/System.out(2761): Row Count(Position): 1, pos: 1, Row Count2: 8
04-13 10:15:23.090: I/System.out(2761): Type Team
04-13 10:15:23.090: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:23.090: I/System.out(2761): Row Count(Position): 2, pos: 2, Row Count2: 9
04-13 10:15:23.091: I/System.out(2761): Type Team
04-13 10:15:23.091: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:23.092: I/System.out(2761): Row Count(Position): 0, pos: 0, Row Count2: 10
04-13 10:15:23.092: I/System.out(2761): Type Team
04-13 10:15:23.093: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:23.093: I/System.out(2761): Row Count(Position): 1, pos: 1, Row Count2: 11
04-13 10:15:23.093: I/System.out(2761): Type Team
04-13 10:15:23.093: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:23.093: I/System.out(2761): Row Count(Position): 2, pos: 2, Row Count2: 12
04-13 10:15:23.093: I/System.out(2761): Type Team
04-13 10:15:23.093: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:23.148: I/System.out(2761): Row Count(Position): 0, pos: 0, Row Count2: 13
04-13 10:15:23.148: I/System.out(2761): Type Team
04-13 10:15:23.148: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:23.148: I/System.out(2761): Row Count(Position): 1, pos: 1, Row Count2: 14
04-13 10:15:23.149: I/System.out(2761): Type Team
04-13 10:15:23.149: I/System.out(2761): TextView Id: 2131099654
04-13 10:15:23.149: I/System.out(2761): Row Count(Position): 2, pos: 2, Row Count2: 15
04-13 10:15:23.149: I/System.out(2761): Type Team
04-13 10:15:23.149: I/System.out(2761): TextView Id: 2131099654