Xamarin Android中的自定义可滚动微调器

时间:2018-04-01 02:30:09

标签: xamarin xamarin.android

我需要实现这样的事情。我只是想表现最大。一次3个或4个项目,其余项目应该可滚动。

如果我在下拉列表中共有10个项目,那么下拉列表中一次只能看到4个项目,其他6个项目应该在向下滚动时可见

Java code for Custom Spinner

任何人都可以帮助我,我已经卡住了我已经转换但仍然无法限制微调器下拉项目的高度并滚动其内容

public class CompoundCodeView: Spinner,IJavaObject
{


    Context mContext;

    public CompoundCodeView(Context context) :
        base(context)
        {
        init(context);
    }
    public CompoundCodeView(Context context, IAttributeSet attrs) :
        base(context, attrs)
        {
        init(context);
    }

    public CompoundCodeView(Context context, IAttributeSet attrs, int defStyle) :
        base(context, attrs, defStyle)
        {
        init(context);
    }

    private void init(Context ctx)
    {
        mContext = ctx;
    }

        public override bool PerformClick()
    {
            bool bClicked = base.PerformClick();
        try
        {

         //   Class klass = Class.FromType(typeof(Spinner));
           var klass = Java.Lang.Class.FromType(typeof(Spinner));
            var mPopupField = klass.GetDeclaredField("mPopup");
            mPopupField.Accessible=true;
            ListPopupWindow pop = (ListPopupWindow)mPopupField.Get(this);

            ListView listview = pop.ListView;

            var vklass = Java.Lang.Class.FromType(typeof(View));
           var mScrollCacheField = vklass.GetDeclaredField("mScrollCache");
          mScrollCacheField.Accessible=true;
           Java.Lang.Object mScrollCache = mScrollCacheField.Get(listview);
            var temp = mScrollCache.Class;
            Field scrollBarField=      temp.GetDeclaredField("scrollBar");
            scrollBarField.Accessible = true;
            Java.Lang.Object scrollBar = scrollBarField.Get(mScrollCache);
            Method method = scrollBar.Class.GetDeclaredMethod("setVerticalThumbDrawable",Class.FromType(typeof(Drawable)) );
            method.Accessible = true;
            method.Invoke(scrollBar,Resources.GetDrawable(Resource.Drawable.scrollbar_style));
            if (VERSION.SdkInt >= VERSION_CODES.Honeycomb)
            {
                var vlass = Java.Lang.Class.FromType(typeof(View));
        var       mVerticalScrollbarPositionField = vlass.GetDeclaredField("mVerticalScrollbarPosition");
                mVerticalScrollbarPositionField.Accessible=true;
                mVerticalScrollbarPositionField.Set(listview,Left);
        }






         }
         catch (Java.Lang.Exception e)
        {
           // e.StackTrace;
        }

        return base.PerformClick();
    }

}

}

1 个答案:

答案 0 :(得分:0)

我已将您对java代码的链接转换为C#,

请注意,看看

public class CompoundCodeView : Spinner
{
    Context mContext;

    public CompoundCodeView(Context context) : base(context)
    {
        init(context, null);
    }

    public CompoundCodeView(Context context, Android.Util.IAttributeSet attrs) : base(context, attrs)
    {
        init(context, attrs);
    }

    public CompoundCodeView(Context context, Android.Util.IAttributeSet attrs, int defStyleAttr) : base(context, attrs, defStyleAttr)
    {
        init(context, attrs);
    }

    private void init(Context ctx, Android.Util.IAttributeSet attrs)
    {
        mContext = ctx;
    }

    public override bool PerformClick()
    {
        bool bClicked = base.PerformClick();

        try
        {
            var klass = Java.Lang.Class.FromType(typeof(Spinner));
            Field mPopupField = klass.GetDeclaredField("mPopup");

            mPopupField.Accessible = (true);
            ListPopupWindow pop = (ListPopupWindow)mPopupField.Get(this);
            ListView listview = pop.ListView;

            var veiw = Java.Lang.Class.FromType(typeof(View));
            Field mScrollCacheField = veiw.GetDeclaredField("mScrollCache");
            mScrollCacheField.Accessible = true;

            Java.Lang.Object mScrollCache = mScrollCacheField.Get(listview);
            Field scrollBarField = mScrollCache.Class.GetDeclaredField("scrollBar");
            scrollBarField.Accessible = true;
            Java.Lang.Object scrollBar = scrollBarField.Get(mScrollCache);
            Method method = scrollBar.Class.GetDeclaredMethod("setVerticalThumbDrawable", Java.Lang.Class.FromType(typeof(Drawable)));
            method.Accessible = (true);
            method.Invoke(scrollBar, Resources.GetDrawable(Android.Resource.Drawable.scrollbar_style));


            if (Build.VERSION.SdkInt >= BuildVersionCodes.Honeycomb)
            {
                Field mVerticalScrollbarPositionField = Java.Lang.Class.FromType(typeof(View)).
                    GetDeclaredField("mVerticalScrollbarPosition");
                mVerticalScrollbarPositionField.Accessible = (true);
                mVerticalScrollbarPositionField.Set(listview, Left);
            }


            return bClicked;
        }
        catch
        {
            return bClicked;
        }
    }
}

如果它不起作用,请告诉我。 Goodluck快乐编码。