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()
- 只有一次玩家计数(团队行)更新有效,之后玩家计数无效
- 当我选择展开团队,然后在团队行上计数并重置李>
<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