gpt4 book ai didi

android - getgroupview 中的 convertview 无法正常工作

转载 作者:行者123 更新时间:2023-11-30 03:32:00 26 4
gpt4 key购买 nike

我正在制作一个使用 ListView 和列表适配器的应用程序。它工作正常,但我在 getgroupview 方法中发现了内存泄漏。在我每次都膨胀 xml 文件并导致泄漏之前。

 groupRow = inflater.inflate(R.layout.activity_phrase, parent, false);

换句话说 - 我没有使用 convertview。所以我将语法更改为:

if (convertView == null) {
groupRow = inflater.inflate(R.layout.activity_phrase, parent, false);
}
else {
groupRow = convertView;
}

此更改后,我在复选框项目方面遇到了问题。如果我单击一个复选框并向下滚动并向上滚动,则会选中越来越多的框。当我只选中一个项目并上下滚动了一会儿时,我在这里显示了列表的图像 listview

这里是覆盖方法 getChildView 中的所有代码

 public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
//LayoutInflater inflater = (LayoutInflater) weakContext.get().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//WeakReference <LayoutInflater> inflaterW = new WeakReference <LayoutInflater> (inflater);

if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) weakContext.get().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
else {
groupRow = convertView;
}
final View theRow = groupRow;

final int group_Position = groupPosition;

TextView textView;
if (isExpanded) {
textView = (TextView) theRow.findViewById(R.id.groupTitle); // fetstil för grupptitel om expanderad
textView.setTypeface(null, Typeface.BOLD);
textView.setText(titles[groupPosition]);
}
else {
textView = (TextView) theRow.findViewById(R.id.groupTitle);
textView.setText(titles[groupPosition]);
textView.setTypeface(null, Typeface.ITALIC);
}

System.out.println("grupppos: " + groupPosition);
System.out.println("size checked list: " + checked.size());
CheckBox cb = (CheckBox) theRow.findViewById(R.id.check);
for (int i = 0; i < checked.size(); i++) { // kontrollera om aktuell grupp som visas i vyn är tillagd i favoriter.
if (checked.get(i) == groupPosition) {
cb.setChecked(true);
System.out.println("TRUE");
}
else {

}
}


// Lyssnare till checkboxobjektet.
cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) { // Tillagd i favoriter
checked.add(group_Position); // registrera att denna position är tillagd som favorit
System.out.println("I SETONCHECKEDCHANGELISTENER");
// Lägger in nödvändiga parametrar i mysqlLite.
int n_childs = contents[group_Position].length;

switch(n_childs) { // om båda könen
case 1: sql.addPhrase(group_Position, category, titles[group_Position], contents[group_Position][0],
sound[group_Position][0]);
break;
case 2: sql.addPhrases(group_Position, category, titles[group_Position], contents[group_Position][0], // om kap o ka
contents[group_Position][1], sound[group_Position][0], sound[group_Position][1]);
break;
}
}
else { // avregistrerad från favoriter
for (int i = 0; i < checked.size(); i++) {
if (checked.get(i) == group_Position) {
checked.remove(i);
}
}

int n_phrases = sql.getRowCount();
Object[][] phrase = sql.getPhraseList();
int id = -1;
for (int i = 0; i < n_phrases; i++) {
if ((Integer) phrase[i][1] == group_Position && (Integer) phrase[i][2] == category) {
id = (Integer) phrase[i][0];
}
}
sql.deletePhrase(id); // radera fras från mysqlLite m.a.p. primärnyckel-id.
}

}
});

return theRow;
}

非常感谢您的帮助!!!!

最佳答案

你调用了cb.setChecked(true),你还应该在相应的else分支中调用cb.setChecked(false)。由于 View 被回收, View 状态也被回收,您必须自己重置它。

此外,似乎没有任何代码可以让您首先膨胀 View (如果 convertView 为 null),但这可能只是这个问题的一个问题。

关于android - getgroupview 中的 convertview 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17299446/

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