gpt4 book ai didi

android - ArrayAdapter 为每一行调用 getView 五次并产生意外行为

转载 作者:行者123 更新时间:2023-11-30 02:14:21 24 4
gpt4 key购买 nike

在我的应用程序中,用户将从不同的团队中选择球员。在屏幕顶部有计数,显示总数。所选球员的数量和每支球队的行数将显示总数。从该队中选出的球员。

我正面临 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>

父类.xml

<?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="#9999ff"
android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="10dp" >

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

<TextView
android:id="@+id/tViewNoOfSelectionFrmPatent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="0" />
</RelativeLayout>

子.xml

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

主 Activity .java

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);
}
}

团队适配器.java

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;
}
}

团队.java

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;
}
}

LogCat:-

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

enter image description here

最佳答案

我认为,您想制作一个 ListView,其中 Teams 是 parent ,Players 是 child 。

Quoting安卓工程师 RomainGuy

This is not an issue, there is absolutely no guarantee on the order in which getView() will be called nor how many times.

据我了解,由于这些分配的 layout_height="wrap_content" 适配器会输入很多时间来计算特定高度。

您需要将 layout_height="match_parent" 放在 ListView 中以避免这种行为。

附言

我对你的代码有一些观察:

  • 为什么使用 ListView 而不是 ExpandableListView?这是一个更好的选择。
  • 实现 Holder 模式,如果您将使用 ListView,这是一个很好的做法。
  • 不要在实体 bean 中实现 View 行为。这会及时生成不支持的代码。
  • child.xml 中最好使用 CheckBox 而不是 ImageView。只需要更改 CheckBox View 样式即可。

我接受了你的代码并重构了它,你可以在我的 GitHub 上查看 https://github.com/cesardl/android-training

关于android - ArrayAdapter 为每一行调用 getView 五次并产生意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29598154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com