关注代码:
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>
示例图片:
我想在第一个位置涂上黄色。
我想让背景位于OnCreateView
的第一个位置,是否可能?
我有一个带有数字的gridview我需要在第一个位置加载背景,这是数字1.我该怎么做?
答案 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)
方法获取单元格视图,并设置背景颜色,就像在代码示例中一样。