【问题标题】:View Visiblity issue while scrolling of Listview滚动 Listview 时查看可见性问题
【发布时间】:2015-04-20 01:41:28
【问题描述】:

我有一个带有 textview 和 imageview 的自定义列表视图以及类似复选标记的 imageview。选择 textview 时,在 Listview 的 OnItemClickListener 上,我将使 imageview Visibilty 可见以显示已选中。

 stickyList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
                stickyList.setOnItemClickListener(new OnItemClickListener() {

                    @Override
                    public void onItemClick(AdapterView<?> parent, View view,
                            int position, long id) {
                        // TODO Auto-generated method stub
                        String tag = (String) ((TextView) view
                                .findViewById(R.id.tvtag)).getText();
                         ImageView cb = (ImageView)
                         view.findViewById(R.id.ic_check);
                        if (cb.getVisibility() == View.VISIBLE) {
                            cb.setVisibility(
                                    View.GONE);

                            selectedtags.remove(tag);
                        } else {
                            cb.setVisibility(
                                    View.VISIBLE);
                            selectedtags.add(tag);
                        }
                    }
                });

它工作正常,直到 Listview 向下滚动。如果我选择了 listview 的前两个位置 textview,当我向下滚动 listview 时,第一个两个位置的 imageview(cb) 的可见性是可见的。这意味着在向下滚动后,相同位置的 imageview 变得可见。

获取视图方法:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    ViewHolder holder;
    if (convertView == null) {
        holder = new ViewHolder();
        convertView = mInflater.inflate(R.layout.recenttag_list_item,
                parent, false);
        holder.text = (TextView) convertView.findViewById(R.id.tvtag);
        holder.checkmark = (ImageView) convertView
                .findViewById(R.id.ic_check);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.text.setText(data.get(position).mytag);
    return convertView;
}

【问题讨论】:

    标签: android listview android-listview android-scrollbar


    【解决方案1】:

    您看到的原因是列表项视图被回收(这就是convertView 的用途)。当您滚动 ListView 时,滚动到屏幕外的上一个项目将作为下一个位置的 convertView 传递回您的适配器。

    您需要确保在每次调用 getView() 时完全重置项目视图的状态,这样这样的更改就不会从视图项目的一次使用泄漏到下一次使用。这可能意味着您必须始终检查 getView() 中该位置的当前“已检查”值以确定它是否应该可见。

    编辑:也许这会有所帮助...

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    
        ViewHolder holder;
    
        /* Unchanged code omitted */
    
        holder.text.setText(data.get(position).mytag);
    
        boolean checkVisible = ???; //Use whatever logic your app has to determine if this position should be checked
        holder.checkmark.setVisibility(checkVisible);  //Always set the visibility to what it should be for this position
    
        return convertView;
    }
    

    【讨论】:

    • 我没听明白。你能说得具体点吗,请我添加了 snapchats。再检查一次!
    • 简单地说,当你滚动 ListView 时,滑入视图的项目不是从头开始创建的新视图,它们是滚动到屏幕外被重复使用(或回收)的旧视图.如果在getView() 中将convertView 交给您,则这是一个旧视图,您需要重置与该位置无关的任何内容(在您的情况下,图像可见性)。
    • 调用 NotifiyDataSetChanged 会对我有帮助吗?我现在该怎么办 ?你能添加一些代码吗?请。
    • 不,更新适配器不会改变任何东西。我试着用代码把它拼出来。
    • 非常感谢开发者!!你拯救了我的一天。我从没想过 Getview 回收。我一直在 google+ 上关注你。你摇滚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2020-11-28
    • 2011-06-02
    • 2020-12-30
    • 2014-08-17
    • 1970-01-01
    • 2019-03-04
    相关资源
    最近更新 更多