复选框检查在列表项周围随机跳转?

时间:2016-06-01 11:42:41

标签: xamarin xamarin.android

我有一个ExpandableListView声明如下:

<ExpandableListView
        android:id="@+id/ListBExpandable"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

我将Child Item布局声明如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:minWidth="25px"
    android:minHeight="25px" >
    <CheckBox
        android:text="CheckBox"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/checkBoxBListItem" />
</LinearLayout>

当我检查孩子的复选框并展开或关闭某个组元素时,选中的复选框开始跳入似乎是随机位置。

这是适配器的来源:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;

namespace LEX.Droid
{
    public class BActivityGroupedAdapter : BaseExpandableListAdapter
    {
        public static List<BNodeProxy> bNodes = bew List<BNodeProxy>();
        public static Dictionary<int, BGroupProxy> bGroups = new Dictionary<int, BGroupProxy>();

        Activity  context;
        List<int> groupKeys;
        List<int> filteredGroupKeys;
        Dictionary<int,List<int>> filteredItems;

        public BActivityGroupedAdapter( Activity context, Dictionary<int,List<int>> filteredItems )
        {
            this.context = context;                    
            groupKeys = bGroups.Keys.ToList();

            this.filteredGroupKeys = filteredGroupKeys;
        }

        public override Java.Lang.Object GetChild( int groupPosition, int childPosition )
        {
            int nodeId = filteredItems[ filteredGroupKeys[ groupPosition ] ][ childPosition ];

            return bNodes.Where( o => o.id == nodeId ).First().label;
        }

        public override long GetChildId( int groupPosition, int childPosition )
        {
            return childPosition; 
        }

        public override int GetChildrenCount( int groupPosition )
        {
            return filteredItems[ filteredGroupKeys[ groupPosition ] ].Count();
        }

        public override View GetChildView( int groupPosition, int childPosition,  bool isLastChild, View convertView, ViewGroup parent )
        {
            View view;

            int nodeId = filteredItems[ filteredGroupKeys[ groupPosition ] ][ childPosition ];

            var item = bNodes.Where( o => o.id == nodeId ).First();

            if( convertView == null )
            {
                view = context.LayoutInflater.Inflate( Resource.Layout.ListChildItem, null );
            }
            else
            {
                view = convertView;
            }

            try
            {

                var checkBoxSelect          = view.FindViewById<CheckBox>( Resource.Id.checkBoxListItem );
                    checkBoxSelect.Text     = item.label;
                    checkBoxSelect.Selected = item.selected;
                    checkBoxSelect.Tag      = item.id;
                    checkBoxSelect.Click   -= theClickEvent;
                    checkBoxSelect.Click   += theClickEvent;
            }
            catch( Exception ex )
            {

            }
            view.Clickable            = false;
            view.Focusable            = false;
            view.FocusableInTouchMode = false;
            view.LongClickable        = false;
            return view;
        }

        public override Java.Lang.Object GetGroup( int groupPosition )
        {
            return bGroups[ filteredGroupKeys[ groupPosition ] ].label;
        }

        public override long GetGroupId( int groupPosition )
        {
            return groupPosition;
        }

        public override View GetGroupView( int groupPosition, bool isExpanded, View convertView, ViewGroup parent )
        {
            View view;

            var item = bGroups[ filteredGroupKeys[ groupPosition ] ].label;

            if( convertView == null )
            {
                var inflater = context.GetSystemService(Context.LayoutInflaterService) as LayoutInflater;
                view = inflater.Inflate( Resource.Layout.ListGroupItem, null );               
            }
            else
            {
                view = convertView;
            }

            try
            {
                var textBox = view.FindViewById<TextView>( Resource.Id.groupItemListText );
                    textBox.SetText( item, TextView.BufferType.Normal );
            }
            catch( Exception ex )
            {
            }

            return view;
        }
        public override bool IsChildSelectable( int groupPosition, int childPosition )
        {
            return true;
        }

        public override int GroupCount
        {
            get
            {
                return filteredGroupKeys.Count;
            }
        }

        public override bool HasStableIds
        {
            get
            {
                return true;
            }
        }

        private void theClickEvent( object sender, EventArgs e )
        {
            var selectionState = ( (CheckBox)sender ).Checked;
            int tagId          = (int)( (CheckBox)sender ).Tag;

            bNodes.Where( o => o.id == tagId ).First().selected = selectionState;

        }
    }
}
  • 如何防止此奇怪行为导致复选框?

1 个答案:

答案 0 :(得分:1)

发现错误..

 checkBoxSelect.Selected = item.selected;

实际应该是:

 checkBoxSelect.Checked = item.selected;

好像我的堆栈溢出了:)