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

时间:2015-07-16 03:24:10

标签: android gridview android-adapter android-gridview

我用一些String创建一个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>

2 个答案:

答案 0 :(得分:2)

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

}

答案 1 :(得分:1)

问题是

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

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

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

相关问题