如何将第一个位置的背景设置为默认值?

时间:2018-03-12 14:35:47

标签: c# xamarin xamarin.android

关注代码:

Fragment1.cs:

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    view = inflater.Inflate(Resource.Layout.fragment_1, container, false);
    gridView = (GridView)view.FindViewById(Resource.Id.grid_view);

    gridView.ItemClick += (sender, e) =>
    {
        if (view_1 != null)
        {
            view_1.SetBackgroundColor(Color.Transparent);
        }
        view_1 = e.View;
        e.View.SetBackgroundColor(Color.ParseColor("#FFC107"));
    };

    adapter = new ArrayAdapter<string>(Activity, Resource.Layout.item_1, numbers);

    gridView.Adapter = adapter;

    return view;
}

item_1.axml:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center"
    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
    android:minHeight="?android:attr/listPreferredItemHeightSmall" />

fragment_1.axml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <GridView
        android:id="@+id/grid_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:numColumns="4"
        android:columnWidth="40dp"
        android:verticalSpacing="15dp"
        android:horizontalSpacing="1dp"
        android:paddingTop="2dp"
        android:stretchMode="columnWidth"
        android:layout_centerInParent="true" />
</RelativeLayout>

示例图片:

enter image description here

我想在第一个位置涂上黄色。

我想让背景位于OnCreateView的第一个位置,是否可能?

我有一个带有数字的gridview我需要在第一个位置加载背景,这是数字1.我该怎么做?

3 个答案:

答案 0 :(得分:1)

就像ListView一样,GridView也会重复使用它的孩子。因此,如果使用View.GetChildAt(position)并设置背景颜色。您将获得使用背景颜色渲染的多个视图。

因此,如果您只希望第一个孩子使用背景颜色进行渲染,则必须在SetBackgroundColor时将适配器重写为position==0,并在position!=0时清除颜色:

自定义适配器的GetView方法:

public override View GetView(int position, View convertView, ViewGroup parent)
{
    View view=null;
    if (convertView != null)
    {
        view = convertView;
    }
    else
    {
        view = LayoutInflater.FromContext(parent.Context).Inflate(Resource.Layout.item1,null);
    }

    if (position == 0)
    {
        view.SetBackgroundColor(Android.Graphics.Color.Yellow);
    }
    else
    {
        view.SetBackgroundColor(Android.Graphics.Color.Transparent);
    }

    (view as TextView).Text = _items[position];
    return view;
}

更新

以下是适配器的完整代码:

public class MyGridViewAdapter : BaseAdapter
{
    string[] _items;
    public MyGridViewAdapter(string[] items)
    {
        _items = items;
    }
    public override int Count => _items.Length;

    public override Java.Lang.Object GetItem(int position)
    {
        return _items[position];
    }

    public override long GetItemId(int position)
    {
        return 0;
    }

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        View view=null;
        if (convertView != null)
        {
            view = convertView;
        }
        else
        {
            view = LayoutInflater.FromContext(parent.Context).Inflate(Resource.Layout.item1,null);
        }

        if (position == 0)
        {
            view.SetBackgroundColor(Android.Graphics.Color.Yellow);
        }
        else
        {
            view.SetBackgroundColor(Android.Graphics.Color.Transparent);
        }

        (view as TextView).Text = _items[position];
        return view;
    }
}

答案 1 :(得分:0)

您必须在OnCreate事件中选择要应用颜色的项目

int itemposition = 0;
View tv = gridView.GetChildAt(itemposition);
tv.SetBackgroundColor(Color.ParseColor("#FFC107"));

答案 2 :(得分:0)

由于在第一次布局传递后没有从适配器填充GridView,因此您必须使用ViewTreeObserver更改背景颜色。要获取View ViewTreeObserver,您可以使用View.ViewTreeObserver属性。使用AddOnGlobalLayoutListener()方法向ViewTreeObserver.IOnGlobalLayoutListener添加ViewTreeObserver。第一次调用侦听器时,应填充GridView。

使用GridView中的OnGlobalLayoutListener GetChildAt(int position)方法获取单元格视图,并设置背景颜色,就像在代码示例中一样。