简体   繁体   English

Android ListView重复修改的列表项

[英]Android ListView repeating modified list items

I have a ListView with some list items in. Each item has a delete button, which activates another layer on top of the list item to appear with the text that it has been deleted, as see in the delete onClickListener in the following code. 我有一个包含一些列表项的ListView 。每个项都有一个删除按钮,该按钮将激活列表项顶部的另一层,以显示已被删除的文本,如下面的代码中的onClickListener删除所示。

These activated overlays repeat themselves every so often (like every 8 list items), so I guess android is recycling them somehow... How can I make it so that this problem doesn't happen anymore? 这些激活的overlaysoverlays重复播放一次(就像每8个列表项一样),所以我想android会以某种方式对其进行recycling ...如何使它不再出现此问题?

public View getView(int i, View view, ViewGroup viewGroup) {
    final AnnouncementHolderItem holder;
    final View finalView = view;
    Item curr = getItem(i);
    if(view == null){
        LayoutInflater inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.list_item, null);
        holder = new HolderItem(view);
        view.setTag(holder);
    } else {
        holder = (HolderItem) view.getTag();
    }
    holder.title.setText(curr.getTitle());
    holder.course.setText(curr.getName());
    holder.marker.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(activity, "Item starred!", Toast.LENGTH_SHORT).show();
        }
    });
    holder.delete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ((LinearLayout) finalView.findViewById(R.id.bottomLayer)).setVisibility(View.INVISIBLE);
            LinearLayout delete = (LinearLayout)finalView.findViewById(R.id.deleteLayer);
            delete.setVisibility(View.VISIBLE);
        }
    });
    holder.undelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Reverse of the delete + a toast message
        }
    });
    return finalView;
}

And the list item is a FrameLayout , with the deleted layer on top (default invisible) and the info about the item below it. 列表项是一个FrameLayout ,其删除的图层在顶部(默认不可见)在其上,而有关该项目的信息在其下面。

You're exactly right: the listview is recycling views. 您完全正确:listview正在回收视图。 You need some means of keeping track of which items have been "deleted" outside the control of the listview. 您需要一些方法来跟踪列表视图控制范围之外的哪些项已被“删除”。 In your case, it sounds like a simple array would do the trick. 在您的情况下,听起来像一个简单的数组就可以解决问题。

Below is an example of code I've used to do the same thing. 下面是我用来做同样事情的代码示例。 In this case, it's a checkbox, where all checkboxes are initially unchecked. 在这种情况下,这是一个复选框,其中所有复选框最初都未选中。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.dialog_checkbox_item, null);
        holder = new ViewHolder();
        holder.checkbox = (CheckBox)convertView.findViewById(R.id.dialog_checkbox);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder)convertView.getTag();
        if (checkedArray[position] == true)
            holder.checkbox.setChecked(true);
        else
            holder.checkbox.setChecked(false);
    }
    holder.checkbox.setText((CharSequence) mData.get(position));
    return convertView;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM