当 GridView 滚动时,它会更改其视图的激活状态

When the GridView scrolls, it changes its view's activated status

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

如果我不滚动 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>

当您滚动网格视图时,视图会被回收。如果您更改一个子视图的状态然后向下滚动并且该子视图被重用但新数据没有相同的状态,您的子视图将具有与您第一次设置它时相同的状态。创建一个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);
    }

}

问题是

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

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

你还需要写 else 语句因为适配器重用了已经创建的旧视图所以 if 和 else 都应该在那里。