gpt4 book ai didi

android - 可扩展 ListView 重复 View

转载 作者:行者123 更新时间:2023-11-29 00:09:36 25 4
gpt4 key购买 nike

我的问题如下。
我正在实现一个 ExapndableListView,第一组有 child ,他们的布局由这 3 个组成:TextView、ImageView、ImageView。
现在,当点击一个 child 时,我使用 v.findViewById().setVisibility() 设置了两个 ImageView 之一的可见性,并且它的工作正常,正如我想象的那样。
问题是当列表超过 10 个时 children ,当向下滚动时,android 系统使用顶部最后一个隐藏的 View 回收 View ,现在当我单击位置“0”的 child 时,我只切换那个 View 的图像,而其他 View 没有改变,到目前为止很好,但是当我向下滚动并且android系统使用位置“11”的 child 中的 child “0” View 回收 View 时,它会更改对应于 child “11”的textView,但用于 child “11”的 View "是 child "0"的 View ,因此与之前切换的相同图像出现在 child "11"的 View 中,就好像它也被点击了,但事实并非如此!我这样做:

@Override
public View getChildView(final int parentPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {

Log.d("status","parent : "+parentPosition + " child : " + childPosition + " View : "+convertView + " ViewGroup : "+parent);
int itemType = 25;
itemType = getChildType(parentPosition, childPosition);
String child_title = (String) getChild(parentPosition,childPosition);
if (convertView == null)
{
if (itemType == 0)
{
LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.activities2_child_layout, parent, false);

} else if (itemType == 1) {
LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.activities2_child2_layout, parent, false);
} else if (itemType == 2) {
LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.activities2_child2_layout, parent, false);
}
}
if (itemType == 0)
//region parent 0 child handling
{
Log.d("Child", childPosition + " : " + child_title);

final TextView child_textview = (TextView) convertView.findViewById(R.id.activities2_child_txt);
final ImageView img_Likes = (ImageView) convertView.findViewById(R.id.activities2_img_like);
final ImageView img_Dislikes = (ImageView) convertView.findViewById(R.id.activities2_img_dislike);
child_textview.setText(child_title);

child_textview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

switch (AAChildClicks[childPosition]) {
case 0:
AAChildClicks[childPosition]++;
img_Likes.setVisibility(View.VISIBLE);
//add to total
All_Likes.add(child_textview.getText().toString());
Log.d("Likes", "Likes + " + child_textview.getText().toString());
break;
case 1:
AAChildClicks[childPosition]++;
img_Likes.setVisibility(View.GONE);
img_Dislikes.setVisibility(View.VISIBLE);
String child = child_textview.getText().toString();
//remove from total
All_Likes.remove(child_textview.getText().toString());
Log.d("Likes", "Likes - " + child_textview.getText().toString());
//add to total
All_Dislikes.add(child_textview.getText().toString());
Log.d("Likes", "Dislikes + " + child_textview.getText().toString());
break;
case 2:
AAChildClicks[childPosition] = 0;
img_Likes.setVisibility(View.GONE);
img_Dislikes.setVisibility(View.GONE);
String child2 = child_textview.getText().toString();
//remove from total
All_Dislikes.remove(child_textview.getText().toString());
Log.d("Likes", "Dislikes - " + child_textview.getText().toString());
break;
}
}

});
}
//endregion

if (itemType == 1)
//region parent 1 child handling
{
TextView child_textview = (TextView) convertView.findViewById(R.id.activities2_child2_txt);
child_textview.setText(child_title);
}
//endregion

if (itemType == 2)
//region parent 2 child handling
{
TextView child_textview = (TextView) convertView.findViewById(R.id.activities2_child2_txt);
child_textview.setText(child_title);
}
//endregion

return convertView;
}

如何避免这种重复/错误?!

最佳答案

当 View 被回收时,其组件将保持与之前相同的可见性状态。因此,如果您隐藏了 View 的某些部分,那么当它被回收时,这些部分将被隐藏。

因此,您需要做两件事:

  1. 每次调用 GetChildView 时,将 View 的可见性设置为正确的状态。

  2. 您需要跟踪 View 之外的位置数据。现在,您对 View 可见性的唯一记录是在 View 本身上。当该 View 被回收时,您的记录将丢失( View 的状态成为某个其他位置的起始状态——这就是我们必须在 #1 中覆盖它的原因)。

您应该在某种列表或节点类型架构中跟踪 View 可见性——您不能将该数据存储在 View 上,因为它们不会与任何一个位置永久关联。

关于android - 可扩展 ListView 重复 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31249860/

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