【问题标题】:When the GridView scrolls, it changes its view's activated status当 GridView 滚动时,它会更改其视图的激活状态
【发布时间】:2015-07-16 03:24:10
【问题描述】:

我用一些字符串创建了一个网格视图。当我点击每一个时,我将其状态更改为已激活,并使用该属性来更改所选项目的颜色。

如果我不滚动 gridview,一切都会正常工作,但是如果我选择了一项并且在我滚动 gridview 之后,每次滚动 gridview 时,该项目都会开始改变它的颜色。

你能帮我找出错误吗? :(

这是我的代码:

@Override
    public View getView(int i, View view, ViewGroup viewGroup) 
    {
        ViewHolder viewHolder;
        // General ListView optimization code.

        if (view == null) {
            view = mInflator.inflate(R.layout.gridview_command_element, null);
            viewHolder = new ViewHolder();
            viewHolder.boh = (TextView) view.findViewById(R.id.cmd_name);
            view.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) view.getTag();
        }


        final String Name = lista.get(i);

        if (Name != null)
        {  
            viewHolder.boh.setText(Name);
        }

        return view;
    }

    static class ViewHolder 
    {
       TextView boh;
    }

这是 onitemclicklistener:

@Override
    public void onItemClick(AdapterView<?> parent, View view, int position,long id) 
    {


        if(adapter4selectedCmd.getCount() < 10)
        {   

            view.setActivated(true);
            String cmd = (String)adapter.getItem(position);
        }
        else
        {
            view.setActivated(false);
        }

    }

这是 xml 布局和选择器:

    <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_activated="true" android:color="@color/tableTextSelectedColor" />
    <item android:color="@color/tableTextColor" />
</selector>


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:gravity="center_vertical|center_horizontal"
              android:id="@+id/ecu_list_element"
              >

    <TextView android:id="@+id/cmd_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="24dp"
            android:textColor="@color/text_selector"
            android:gravity="center_horizontal|center_vertical"/>


</LinearLayout>

【问题讨论】:

标签: android gridview android-adapter android-gridview


【解决方案1】:

当您滚动网格视图时,视图会被回收。如果您更改一个子视图的状态,然后向下滚动并且该子视图被重用,但新数据的状态不同,您的子视图将具有与您第一次设置它时相同的状态。创建一个SparseBooleanArray 来保存每个对象的状态。除了将视图设置为仅在按钮单击中激活之外,您还需要更新稀疏布尔数组并检查 getView() 方法调用中的布尔数组以设置激活位置。

SparseBooleanArray booleanArray = new SparseBooleanArray();
@Override
public View getView(int i, View view, ViewGroup viewGroup) 
{
    ViewHolder viewHolder;
    // General ListView optimization code.

    if (view == null) {
        view = mInflator.inflate(R.layout.gridview_command_element, null);
        viewHolder = new ViewHolder();
        viewHolder.boh = (TextView) view.findViewById(R.id.cmd_name);
        view.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) view.getTag();
    }


    final String Name = lista.get(i);

    if (Name != null)
    {  
        viewHolder.boh.setText(Name);
    }
    if(booleanArray.get(i)){
        view.setActivated(true);
    } else {
        view.setActivated(false);
    }
    return view;
}

static class ViewHolder 
{
   TextView boh;
}

这里是 onitemclicklistener:

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,long id) 
{


    if(adapter4selectedCmd.getCount() < 10)
    {   

        view.setActivated(true);
        booleanArray.put(position, true);
        String cmd = (String)adapter.getItem(position);
    }
    else
    {
        view.setActivated(false);
        view.put(position, false);
    }

}

【讨论】:

  • 谢谢!因此,在 buttonclick 我必须调用填充此 sparseBooleanArray 的适配器方法?你能举个小例子吗?对不起..
  • 是的,检查编辑我假设您的 onclick 属于同一类,但您应该明白这一点。
  • 完美运行!!!而且我在 listview/gridview 上学到了新东西!谢谢:D
【解决方案2】:

问题是

if (Name != null)
        {  
            viewHolder.boh.setText(Name);
        }

您必须在 getView 方法中使用带有 if 语句的 else 语句。

您还需要编写 else 语句,因为适配器重用了已创建的旧视图,因此 if 和 else 都应该存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多