自定义ExpandableListView中的可单击视图

时间:2012-07-03 20:46:40

标签: android xamarin.android

transferAvailPowered.axml

<?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="wrap_content"
android:focusable="false"
android:layout_margin="5dp"
android:padding="5dp"
android:gravity="left">
<TextView
    android:id="@+id/availSerial"
    android:layout_width="0dp"
    android:layout_weight=".30"
    android:layout_height="wrap_content"
    android:layout_marginLeft="45dp"
    android:layout_marginRight="5dp"
    android:layout_marginTop="5dp"
    android:layout_marginBottom="5dp"
    android:focusable="false"
    android:padding="5dp"
    android:gravity="left" />
<TextView
    android:id="@+id/availModel"
    android:layout_width="0dp"
    android:layout_weight=".30"
    android:layout_height="wrap_content"
    android:layout_margin="5dp"
    android:focusable="false"
    android:padding="5dp"
    android:gravity="left" />
<AutoCompleteTextView
    android:id="@+id/availSite"
    android:layout_width="120dp"
    android:layout_height="wrap_content"
    android:padding="5dp"
    android:hint="To Site"
    android:background="@android:color/white"
    android:textColor="@android:color/black"
    android:textCursorDrawable="@null"
    android:focusable="false"
    android:layout_margin="5dp"
    android:gravity="left" />
<ImageButton
    android:id="@+id/addToTransfer"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="5dp"
    android:layout_margin="5dp"
    android:background="@drawable/addsmall"
    android:focusable="false"
    android:gravity="left" />

transferAvailAttached.axml

<?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="wrap_content"
android:focusable="false"
android:layout_margin="5dp"
android:padding="5dp">
<TextView
    android:id="@+id/availSerial"
    android:layout_width="0dp"
    android:layout_weight=".30"
    android:focusable="false"
    android:layout_height="wrap_content"
    android:layout_margin="5dp"
    android:padding="5dp"
    android:gravity="right" />
<TextView
    android:id="@+id/availModel"
    android:layout_width="0dp"
    android:layout_weight=".30"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:layout_margin="5dp"
    android:padding="5dp"
    android:gravity="center" />
<CheckBox
    android:id="@+id/include"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="left|center_vertical"
    android:focusable="false"
    android:layout_marginRight="30dp"
    android:background="@drawable/bg_checkbox" />
<ImageButton
    android:id="@+id/removeAttachment"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:padding="5dp"
    android:layout_margin="5dp"
    android:background="@drawable/deletesmall"
    android:gravity="right" />

适配器

class EquipAdapter : BaseExpandableListAdapter
{
    private List<CPEquipment> Parent { get; set; }
    private List<List<CPEquipment>> Child { get; set; }
    private Context _context { get; set; }
    private IListAdapter _adapter { get; set; }
    private ExpandableListView _list { get; set; }

    public EquipAdapter(Context context, List<CPEquipment> parent, List<List<CPEquipment>> child, IListAdapter adapter, ExpandableListView list)
    {
        _context = context;
        Parent = parent;
        Child = child;
        _adapter = adapter;
        _list = list;
    }

    public override Java.Lang.Object GetChild(int groupPosition, int childPosition)
    {
        List<CPEquipment> level1 = Child.ElementAt(groupPosition);
        CPEquipment level2 = level1.ElementAt(childPosition);
        E e = new E() {Serial = level2.Serial, Model = level2.Model};
        return e;
    }

    public override long GetChildId(int groupPosition, int childPosition)
    {
        return Convert.ToInt32(groupPosition.ToString(CultureInfo.InvariantCulture) + childPosition.ToString(CultureInfo.InvariantCulture));
    }

    public override int GetChildrenCount(int groupPosition)
    {
        return Child.ElementAt(groupPosition).Count;
    }

    public override View GetChildView(int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent)
    {
        if (convertView == null)
        {
            LayoutInflater inflater = (LayoutInflater)_context.GetSystemService(Context.LayoutInflaterService);
            convertView = inflater.Inflate(Resource.Layout.transferAvailAttached, null);
        }

        E e = (E)GetChild(groupPosition, childPosition);
        TextView serial = (TextView)convertView.FindViewById(Resource.Id.availSerial);
        serial.Text = e.Serial;
        TextView model = (TextView)convertView.FindViewById(Resource.Id.availModel);
        model.Text = e.Model;          

        return convertView;
    }

    public override Object GetGroup(int groupPosition)
    {
        CPEquipment c = Parent.ElementAt(groupPosition);
        E e = new E(){Serial = c.Serial, Model = c.Model, Type = c.Status}; 

        return e;
    }

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

    public override View GetGroupView(int groupPosition, bool isExpanded, View convertView, ViewGroup parent)
    {
        E e = (E)GetGroup(groupPosition);

        if (convertView == null)
        {
            LayoutInflater inflater = (LayoutInflater)_context.GetSystemService(Context.LayoutInflaterService);
                convertView = inflater.Inflate(Resource.Layout.transferAvailPowered, null);
     }

        TextView serial = (TextView)convertView.FindViewById(Resource.Id.availSerial);
        serial.Text = e.Serial;
        TextView model = (TextView)convertView.FindViewById(Resource.Id.availModel);
        model.Text = e.Model;
        AutoCompleteTextView acText = (AutoCompleteTextView)convertView.FindViewById(Resource.Id.availSite);
        acText.Adapter = _adapter;

        _list.ExpandGroup(groupPosition);

        return convertView;
    }

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

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

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

}

结果:

enter image description here

在这种情况下,父组中的AutoCompleteTextView和绿色加号按钮应为“可选”,以便用户可以将信息输入到字段中并单击该按钮而不折叠组。而CheckBox和孩子中的红色x按钮也应该是“可选择的”,这样用户就可以检查CheckBox并单击按钮。实际上有效的唯一部分是CheckBox是可选择的,并且该组不会崩溃,因为由于缺少更好的术语,组布局“死”并且在按下时不执行任何操作。而看似“工作”的CheckBox甚至不是这样,因为它确实会检查或取消选中一个会随机检查或取消选中其他人。

1 个答案:

答案 0 :(得分:1)

下面的代码是解决复选框问题“CheckBox甚至不是这样,因为它检查或取消选中一个会随机检查或取消选中其他人时会发生这种奇怪的事情。”与ImageButton和CheckBox一起处理。

public override View GetChildView(final int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent)
{
    LayoutInflater inflater = (LayoutInflater)_context.GetSystemService(Context.LayoutInflaterService);
    convertView = inflater.Inflate(Resource.Layout.transferAvailAttached, null);

    E e = (E)GetChild(groupPosition, childPosition);
    TextView serial = (TextView)convertView.FindViewById(Resource.Id.availSerial);
    serial.Text = e.Serial;
    TextView model = (TextView)convertView.FindViewById(Resource.Id.availModel);
    model.Text = e.Model;     

    CheckBox include = (CheckBox)convertView.FindViewById(Resource.Id.include); 

    include.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // TODO Auto-generated method stub
            //DO your checkbox handling here
        }
    });

    ImageButton removeAttachment =(CheckBox)convertView.FindViewById(Resource.Id. removeAttachment);  

    removeAttachment.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            // TODO Auto-generated method stub
            //DO your imageButton handling here
        }
    });

    return convertView;
}

public override View GetGroupView(final int groupPosition, bool isExpanded, View convertview, ViewGroup parent)
{
    View convertView = convertview;
    if (convertView == null) 
    {
        E e = (E)GetGroup(groupPosition);

        LayoutInflater inflater = (LayoutInflater)_context.GetSystemService(Context.LayoutInflaterService);
        convertView = inflater.Inflate(Resource.Layout.transferAvailPowered, null);
    }

    TextView serial = (TextView)convertView.FindViewById(Resource.Id.availSerial);
    serial.Text = e.Serial;
    TextView model = (TextView)convertView.FindViewById(Resource.Id.availModel);
    model.Text = e.Model;
    AutoCompleteTextView acText = (AutoCompleteTextView)convertView.FindViewById(Resource.Id.availSite);
    acText.Adapter = _adapter;

    ImageButton addToTransfer =(CheckBox)convertView.FindViewById(Resource.Id. addToTransfer);  

    addToTransfer.setOnClickListener(new OnClickListener() {                        
        public void onClick(View v) {
            // TODO Auto-generated method stub

            //DO your addToTransfer imageButton handling here

        }
    });

    _list.ExpandGroup(groupPosition);

    return convertView;
}