【问题标题】:Programmatically set the background color of a list view item以编程方式设置列表视图项的背景颜色
【发布时间】:2019-05-29 10:01:13
【问题描述】:

在我的应用程序中,我必须根据该列表视图项的字符串内容自动设置ListView 项的背景颜色。

目前,该应用正在使用以下代码:

    private void UpdateListView(string itemFromList, ListView listView)
    {
        int itemListPosition = listViewAdapter.GetPosition(itemFromList);
        listView.SetItemChecked(itemListPosition, true);

        View child = listView.GetChildAt(itemListPosition);

        if (child != null)
        {
            for (int i = 0; i < listViewAdapter.Count; i++)
            {
                View otherChild = listView.GetChildAt(i);

                if (otherChild != null)
                {
                    otherChild.SetBackgroundColor(defaultColor);
                }
            }

            child.SetBackgroundColor(Color.Green);
        }
    }

其中listViewAdapterMainActivity 类中的全局变量,在onCreate 方法中定义如下:

listViewAdapter= new ArrayAdapter<String>(this, Android.Resource.Layout.SimpleListItem1, settingItems);
listView.Adapter = listViewAdapter;

settingItems 只是一个定义为字符串列表的全局变量。

上面的代码工作正常,所以给定列表视图项的背景颜色变为绿色,其余列表视图项变为默认颜色,直到列表视图添加垂直滚动。

现在在列表视图获得更多项目和垂直滚动之后,

View child = listView.GetChildAt(itemListPosition);

来自上述调用的child 对象为空。因此,我不能再根据它们的位置从列表视图中访问这些项目。你知道我该如何解决这个问题吗?

【问题讨论】:

标签: android xamarin xamarin.android


【解决方案1】:

我在GetView方法中写了一个demo,设置item背景颜色,你可以参考一下。

这是演示的 GIF。

您可以更改列表视图适配器的GetView 方法中的代码。我不知道你想在listview中更改哪些项目,所以我将位置设置在1,3,5中。你可以自己改变它。

MyAdapter.cs

   class MyAdapter : BaseAdapter<ColorDemo>
{
    Activity context;
    List<ColorDemo> colors { get; set; }
    public MyAdapter(Activity context , List<ColorDemo> colors)
    {
        this.context = context;
        this.colors = colors;

    }

    public override ColorDemo this[int position] {
        get
        {
            return colors[position];
        }
    }

    public override int Count => colors.Count;



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

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        View newView = convertView;
        if (newView == null)
            newView = context.LayoutInflater.Inflate(Resource.Layout.ItemView, null);
        newView.FindViewById<TextView>(Resource.Id.item_tv).Text = colors[position].ColorName;
        if (position==1|| position == 3|| position == 5)
        {
            newView.FindViewById<TextView>(Resource.Id.item_tv).SetBackgroundColor( Color.Blue);

        }
        else
        {
            newView.FindViewById<TextView>(Resource.Id.item_tv).SetBackgroundColor(Color.Green);

        }

       return newView;

    }
}

下面是activity_main.axmlItemView.axml,可以通过ItemView自定义listview中的item

activity_main.axml

 <?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent">

    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:id="@+id/lv_color"
     />
  </RelativeLayout>

ItemView.axml

<?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="match_parent">
  <TextView 
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="this text"
    android:textSize="50dp"
    android:id="@+id/item_tv"
    android:background="@android:color/holo_red_dark"
    />
</LinearLayout>

以下代码与MainActivity.cs相关

MainActivity.cs

    [Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
public class MainActivity : AppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.activity_main);
        ListView lv_color = FindViewById<ListView>(Resource.Id.lv_color);
       // lv_color.SetItemChecked(2,true);
        List<ColorDemo> colors = new List<ColorDemo>();
        colors.Add(new ColorDemo("red"));
        colors.Add(new ColorDemo("green"));
        colors.Add(new ColorDemo("red"));
        colors.Add(new ColorDemo("green"));
        colors.Add(new ColorDemo("green"));
        colors.Add(new ColorDemo("green"));
        colors.Add(new ColorDemo("red"));
        colors.Add(new ColorDemo("green"));
        colors.Add(new ColorDemo("red"));
        colors.Add(new ColorDemo("green"));
        colors.Add(new ColorDemo("green"));
        colors.Add(new ColorDemo("green"));
        colors.Add(new ColorDemo("red"));
        colors.Add(new ColorDemo("green"));
        colors.Add(new ColorDemo("red"));
        colors.Add(new ColorDemo("green"));
        colors.Add(new ColorDemo("green"));
        colors.Add(new ColorDemo("green"));

        MyAdapter myAdapter = new MyAdapter(this,colors);
        lv_color.Adapter=myAdapter;
    }
}

【讨论】:

  • 首先我要感谢你提供这个例子。其次,我想提一下,该示例以某种方式进行了硬编码,这意味着您始终从具有蓝色背景的列表中创建第二个项目。在我的情况下,如果满足某些条件,此列表项可以具有蓝色背景,但如果满足其他条件,也可以具有红色背景。可以扩展您的示例以支持此功能吗?
  • @clock ,是的,你可以在 MyAdatper 中更改 getView() 的代码,我设置位置 1,3,5 来改变背景颜色,你可以根据你的需求改变位置的颜色,或者你可以提供你的需求,我会尝试编码。
  • 我需要实现的是项目的背景颜色可能会改变。假设我有一个列表,其中包含附近即将发生的本地活动(本地电影、购物折扣等)。每个此事件都有一个开始日期。这些事件存储在视图列表中。当当前日期接近列表中某个事件的日期时,列表中的事件会自动被选中,并且它的背景颜色会发生变化,以便用户更好地看到它。
猜你喜欢
  • 1970-01-01
  • 2016-05-20
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多