在ListView中加载CheckedTextView项,并设置已检查状态

时间:2014-11-19 16:35:57

标签: c# android listview xamarin xamarin.android

当我的活动开始并且我最初加载带有项目的ListView时,我希望能够设置其中一些项目以进行检查,但这似乎不起作用。

我正在使用simple_list_item_multiple_choice layout,因此这些项目为CheckedTextView

这是适配器。文本正确显示,但Checked属性似乎没有在视觉上做任何事情,尽管它被设置为true / false。

public class VehicleSubListAdapter : BaseAdapter<string>
{
    // ...

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        View view = convertView ?? _context.LayoutInflater.Inflate(Android.Resource.Layout.SimpleListItemMultipleChoice, parent, false);

        var checkedTextView = view.FindViewById<CheckedTextView>(Android.Resource.Id.Text1);
        checkedTextView.Text = _items[position].Name;

        // This doesn't seem to do anything
        checkedTextView.Checked = _items[position].Checked;

        // I've even tried this with no change visually
        //checkedTextView.Checked = true;

        return view;
    }
}

这是可以关闭和重新打开的活动,但需要从停止的地方恢复(有些项目已检查,有些项目没有)。这就是事物存储在全局静态变量中的原因。

如果全局列表为空,请手动更新列表。否则,从全局列表加载。它从全局列表中成功加载,并成功存储在项目单击事件中修改的该列表的Checked属性。但是,当活动加载时,选中的项目不会显示为已选中。

此外,我已尝试在FillList()OnCreate中拨打OnResume,但两项都没有效果。

public class VehicleConditionSubActivity : ListActivity
{
    private List<VehicleConditionItemDTO> _items;
    private VehicleSubListAdapter _vehicleAdapter;
    //...

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetTheme(Resource.Style.MyAppTheme);
        SetContentView(Resource.Layout.VehicleConditionItem);

        // Set up action bar
        ActionBar.SetDisplayHomeAsUpEnabled(true);

        // Set up list view
        ListView.ChoiceMode = ChoiceMode.Multiple;
        _items = new List<VehicleConditionItemDTO>();
        _vehicleAdapter = new VehicleSubListAdapter(this, _items);
        ListAdapter = _vehicleAdapter;
        ListView.ItemClick += ListView_ItemClick;

        //...

        // Fill list view
        FillList();
    }

    private void FillList()
    {
        AddFluidItems();
        _vehicleAdapter.NotifyDataSetChanged();
    }

    private void AddFluidItems()
    {
        // I've checked that this is being called correctly
        if (Global.Conditions.FluidLevels.Count > 0)
        {
            foreach (var item in Global.Conditions.FluidLevels)
            {
                _items.Add(item);
            }
        }
        else
        {
            _items.Add(new VehicleConditionItemDTO("1", "Engine oil"));
            // ...

            foreach (var item in _items)
            {
                Global.Conditions.FluidLevels.Add(item);
            }
        }

    }

    // ...

    private void ListView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
    {
        // Items already check/uncheck properly when tapped
        // So I just update the global list items checked property
        Global.Conditions.FluidLevels[e.Position].Checked = !Global.Conditions.FluidLevels[e.Position].Checked;
    }
}

活动的布局是

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:minWidth="25px"
  android:minHeight="25px"
  android:background="@color/background">
  <ListView
      android:minWidth="25px"
      android:minHeight="25px"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:id="@android:id/list" />
</LinearLayout>

1 个答案:

答案 0 :(得分:2)

  

以编程方式选择项目

     

手动设置“已选择”的项目是使用    SetItemChecked 方法(可以多次调用它   选择)

Customizing A List View's Appearance

请注意,SetItemChecked位于ListView。

您可以删除GetView中设置Checked的代码。

然后,在应该最初检查的每个项目之后(或在调用FillList期间),调用: ListView.SetItemChecked(position,true);