滚动画廊启用按下状态并从子项中删除点击侦听器

Posted

技术标签:

【中文标题】滚动画廊启用按下状态并从子项中删除点击侦听器【英文标题】:Scrolling a Gallery enables pressed state and removes click listener from subitems 【发布时间】:2012-07-30 15:54:24 【问题描述】:

我有一个相当复杂的项目库。每个项目由一个图像和 2 个按钮组成。当画廊加载一切正常时,按钮会执行它们应该做的事情,并且按钮的按下状态仅在实际按下按钮时发生。

但是,一旦我滚动图库,按钮就会停止工作,并且单击任何位置都会启用按钮的按下状态。

我已尝试将所有内容嵌入到 LinearLayout 中,但不会按照 this answer 传递 OnDown 事件,但这只会阻止点击事件。

我知道 Gallery 不是此类复杂布局的理想小部件,但我想知道是否有更好的解决方法来解决此问题。

更新:

我将尝试解释一下架构。我有一个 FragmentActivity,其中包含一个 ListFragment,它仅由一个 ListView 组成。

ListView 由一组较小的元素(Bettable)以及一些元信息组成。这些组被实施为画廊。具体来说 我扩展了 Gallery(称为 OneGallery),它做了几件事,它确保一次只滚动一个项目,并且 在滚动发生时转换画廊项目。 Here is the code for that

Here is the adapter for the Gallery

这是Bettable layout的代码

【问题讨论】:

你能发布一些代码吗?真的很难判断你到底发生了什么。 我在更新中添加了一些解释和代码!谢谢。 【参考方案1】:

尝试在子视图周围添加新的包装布局并覆盖 setPressed。画廊将停止将其状态传递给孩子,并且您描述的提到的不良行为将得到修复。

【讨论】:

好的,我明天试试。谢谢。【参考方案2】:

这是视图回收。尝试使用 ViewHolder 模式并为每个 getView 调用设置项目状态。如果你想这样做,你必须在你的复杂对象中保持视图状态。例如,您的复杂对象包含 TextView、ImageView 和 CheckBox

public View getView(int position, View convertView, ViewGroup parent) 

    ComplexObject co = objects.get(position);

    // A ViewHolder keeps references to children views to avoid unneccessary calls
    // to findViewById() on each row.
    ViewHolder holder;

    // When convertView is not null, we can reuse it directly, there is no need
    // to reinflate it. We only inflate a new View when the convertView supplied
    // by ListView is null.
    if (convertView == null) 
        convertView = mInflater.inflate(R.layout.list_item_icon_text, null);

        // Creates a ViewHolder and store references to the two children views
        // we want to bind data to.
        holder = new ViewHolder();
        holder.text = (TextView) convertView.findViewById(R.id.text);
        holder.icon = (ImageView) convertView.findViewById(R.id.icon);
        holder.checkbox = (CheckBox)convertView.findViewById(R.id.checkbox);
        convertView.setTag(holder);
     else 
        // Get the ViewHolder back to get fast access to the TextView
        // and the ImageView.
        holder = (ViewHolder) convertView.getTag();
    

    // Bind the data efficiently with the holder.
    holder.text.setText(co.getText());
    holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);
    holder.checkbox.setChecked(co.isChecked());

    holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() 
                @Override
                public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) 
                    co.setChecked(isChecked);
                
            );


    return convertView;


protected class ViewHolder
    TextView text;
    ImageView icon;
    CheckBox checkbox; 

   

希望对你有帮助

【讨论】:

不幸的是,画廊实际上并没有回收视图,所以这不是原因。我当然会在其他地方使用视图。

以上是关于滚动画廊启用按下状态并从子项中删除点击侦听器的主要内容,如果未能解决你的问题,请参考以下文章

Android - 查看子项数量更改时的侦听器/回调

如何在点击侦听器的标记中删除标记?

事件侦听器(滚动)重复运行

侦听Javascript中元素的子项计数[重复]

鼠标键挂钩 - 键侦听器未触发

JS中常用的一些事件(触发方法)