반응형

 

개요

스피너는 값 집합에서 하나의 값을 선택할 수 있는 빠른 방법을 제공합니다. 기본 상태의 스피너는 현재 선택된 값을 표시합니다. 스피너를 터치하면 기타 모든 사용 가능한 값을 포함하는 드롭다운 메뉴가 표시되며, 여기서 새 값을 선택할 수 있습니다.

Spinner 객체를 사용하여 레이아웃에 스피너를 추가할 수 있습니다. 이 작업은 일반적으로 XML 레이아웃에서 <Spinner> 요소를 사용하여 실행해야 합니다. 예:

 

<Spinner
    android:id="@+id/planets_spinner"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

 

선택 항목 목록으로 스피너를 채우려면 Activity 또는 Fragment 소스 코드에 SpinnerAdapter를 지정해야 합니다.

주요 클래스는 다음과 같습니다.

사용자 선택 항목으로 스피너 채우기

스피너에 제공하는 선택 항목은 어떠한 소스에서든 가져올 수 있지만, SpinnerAdapter를 통해 제공되어야 합니다. 예를 들어 선택 항목을 배열에서 사용할 수 있는 경우에는 ArrayAdapter, 선택 항목을 데이터베이스 쿼리에서 사용할 수 있는 경우에는 CursorAdapter를 통해 제공합니다.

예를 들어, 스피너에 사용할 수 있는 선택 항목이 사전 결정된 경우에는 문자열 리소스 파일에 정의된 문자열 배열을 사용하여 이러한 선택 항목을 제공할 수 있습니다.

 

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="planets_array">
        <item>Mercury</item>
        <item>Venus</item>
        <item>Earth</item>
        <item>Mars</item>
        <item>Jupiter</item>
        <item>Saturn</item>
        <item>Uranus</item>
        <item>Neptune</item>
    </string-array>
</resources>

이러한 배열과 함께 Activity 또는 Fragment에 다음 코드를 사용하여 ArrayAdapter의 인스턴스를 통해 스피너에 이러한 배열을 제공할 수 있습니다.

 

createFromResource() 메서드를 사용하면 문자열 배열에서 ArrayAdapter를 생성할 수 있습니다. 이 메서드의 세 번째 인수는 선택된 항목이 스피너 컨트롤에 나타나는 방식을 정의하는 레이아웃 리소스입니다. simple_spinner_item 레이아웃은 플랫폼에서 제공하며 스피너의 모양에 관해 자체적인 레이아웃을 직접 정의하고자 하지 않을 경우 사용해야 하는 기본 레이아웃입니다.

그런 다음, setDropDownViewResource(int)를 호출하여 어댑터가 스피너 선택 항목의 목록을 표시하는 데 사용해야 하는 레이아웃을 지정해야 합니다(simple_spinner_dropdown_item은 플랫폼에서 정의하는 또 다른 표준 레이아웃임).

setAdapter()를 호출하여 어댑터를 Spinner에 적용합니다.

 

사용자 선택에 응답

사용자가 드롭다운에서 항목을 선택하면 Spinner 객체가 항목 선택 시 이벤트를 수신합니다.

스피너에 관한 선택 이벤트 핸들러를 정의하려면 AdapterView.OnItemSelectedListener 인터페이스와 이에 상응하는 onItemSelected() 콜백 메서드를 구현합니다. 예를 들어, 다음은 Activity의 인터페이스 구현입니다.

public class SpinnerActivity extends Activity implements OnItemSelectedListener {
    ...

    public void onItemSelected(AdapterView<?> parent, View view,
            int pos, long id) {
        // An item was selected. You can retrieve the selected item using
        // parent.getItemAtPosition(pos)
    }

    public void onNothingSelected(AdapterView<?> parent) {
        // Another interface callback
    }
}

AdapterView.OnItemSelectedListener에는 onItemSelected() onNothingSelected() 콜백 메서드가 필요합니다.

그런 후 setOnItemSelectedListener()를 호출하여 인터페이스 구현을 지정해야 합니다.

 

Spinner spinner = (Spinner) findViewById(R.id.spinner);
spinner.setOnItemSelectedListener(this);

 

Activity 또는 Fragment를 사용하여 AdapterView.OnItemSelectedListener 인터페이스를 구현하는 경우(위의 예시 참조) this를 인터페이스 인스턴스로 전달하면 됩니다.

 

 

adapter나 리스너 구현이해가 어렵다면 다음 라이브러리와 같은 오픈소스를 사용하셔도 좋습니다.

github.com/arcadefire/nice-spinner

 

arcadefire/nice-spinner

A nice spinner for Android. Contribute to arcadefire/nice-spinner development by creating an account on GitHub.

github.com

 

참고: developer.android.com/guide/topics/ui/controls/spinner?hl=ko

 

반응형
반응형

개요

안드로이드 개발을 하다보면 ListView와 RecyclerView같은 기능을 많이 사용하게 됩니다.

현재는 ListView는 성능상의 문제로 잘 사용하지 않기 때문에 RecyclerView를 사용하게 됩니다.

저번 포스팅에서 RecyclerView를 다뤘는데 사용하기가 복잡하다고 느낄 수 있기 때문에 다음 라이브러리를 찾아 보았습니다.

 

UltimateRecyclerView

 

cymcsg/UltimateRecyclerView

A RecyclerView(advanced and flexible version of ListView in Android) with refreshing,loading more,animation and many other features. - cymcsg/UltimateRecyclerView

github.com

 

Description

UltimateRecyclerView is a RecyclerView(advanced and flexible version of ListView) with pulling to refresh, loading more, swiping to dismiss, draging and drop, animations ,sticky header,show or hide toolbar and FAB when scrolling and many other features.You can use it just like RecyclerView. Support AndroidX now.

Notice that UltimateRecyclerView is a project under development.

Your donations is highly appreciated. Thank you!

Features:

  • Swipe to refresh(using android.support.v4.widget.SwipeRefreshLayout)
  • Many kinds of animations
  • Swipe to dismiss
  • Parallax or normal head view
  • Drag and drop items
  • Loading more when reach the last item(infinite scrolling)
  • Custom views in loading more
  • Showing or hiding toolbar and floating button when scrolling
  • Scrollbars
  • Colorful styles of swipe to refresh
  • Sticky header like instagram
  • Support different layout in adapter
  • Loading adapter with animation
  • Expandable view in recyclerview

 

사용법은 간단 합니다.

 

종속성 등록 (build.gradle)

repositories {
    jcenter()
}

dependencies {
    ...
    compile 'com.marshalchen.ultimaterecyclerview:library:0.9.0'
}

사용법은 다음 코드와 같이 사용됩니다.

<com.marshalchen.ultimaterecyclerview.UltimateRecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/ultimate_recycler_view"
/>

 

자세한 내용은 다음  WIKI데모 프로젝트를 참고하세요

반응형
반응형

안녕하세요. 애드소프트(Addsoft)입니다.

 

오늘은 C# asp.net mvc를 이용하여 구글 RSS Feed를 파싱해 볼까합니다.

 

 

일단 프로젝트를 Addsoft로 생성하였습니다.

프로젝트에 Models폴더에 RSSFeed.cs 파일을 생성합니다.

 

내용으로 다음을 코딩하여 줍니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Addsoft.Models
{
    public class RSSFeed
    {
        public string Title { get; set; }
        public string ApproxTraffic { get; set; }
        public string Link { get; set; }
        public string Description { get; set; }
        public string PubDate { get; set; }
    }
}

 

Controllers 폴더에 RSSFeedController를 생성하고 다음을 코드를 입력합니다.

using Addsoft.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;
using System.Web.Mvc;
using System.Xml.Linq;

namespace Addsoft.Controllers
{
    public class RSSFeedController : Controller
    {
        // GET: RSSFeed
        public ActionResult Index()
        {
            ViewBag.URL = "https://trends.google.com/trends/trendingsearches/daily/rss?geo=KR";
            return View();
        }

        [HttpPost]
        public ActionResult Index(string RSSURL)
        {
            WebClient wclient = new WebClient();
            wclient.Encoding = Encoding.UTF8;
            string RSSData = wclient.DownloadString(RSSURL);

            //소문자를 읽을 경우 오류로 인식된다.
            XDocument xml = XDocument.Parse(RSSData);

            var RSSFeedData = from x in xml.Descendants("item")
                               select new RSSFeed
                               {
                                   Title = ((string)x.Element("title")),
                                   ApproxTraffic = x.DescendantNodes().ElementAt(3).ToString(),
                                   Link = ((string)x.Element("link")),
                                   Description = ((string)x.Element("description")),
                                   PubDate = ((string)x.Element("pubDate"))
                               };

            ViewBag.RSSFeed = RSSFeedData;
            ViewBag.URL = RSSURL;
            return View();
        }
    }
}

 

Views -> RSSFeed 폴더의 Index.cshtml 파일 추가 합니다.

<!-- products -->
<section class="products py-5">
    <div class="container py-lg-5 py-3">
        <h3 class="heading mb-md-5 mb-4"><strong>구글 트렌드</strong> 일별 인기 급상승 검색어</h3>
        <br />
        @using (Html.BeginForm())
        {
            <input type="URL" name="RSSURL" placeholder="Enter RSS Feed URL Here..." class="form-control" value="@ViewBag.URL" style="width:85%; float: left;" />
        <input type="submit" class="btn btn-danger" style="width: 10%; float: right;"/>

            <br />
        }
        <table class="table table-hover">
                <tr>
                    <th>제목</th>
                    <th>조회수</th>
                    <th>링크</th>
                    <th>설명</th>
                    <th>게시일</th>
                </tr>
                @if (ViewBag.RSSFeed != null)
                {
                    foreach (var item in ViewBag.RSSFeed)
                    {
                        <tr>
                            <td>@item.Title</td>
                            <td>@item.ApproxTraffic</td>
                            <td><a href="@item.Link">@System.Web.HttpUtility.UrlDecode(@item.Link)</a></td>
                            <td>@item.Description</td>
                            <td>@item.PubDate</td>
                        </tr>

                    }
                }
        </table>
    </div>
</section>

저는 bootstrap을 이용했습니다.

필요하시면 다음을 이용하시면됩니다.

코딩위치는 Views => Shared => _Layout.cshtml에 추가하시면 됩니다.

    <link href="@Url.Content("~/Content/bootstrap.min.css")" rel="stylesheet" type="text/css" />
    <script src="@Url.Content("~/Scripts/bootstrap.min.js")"></script>

 

 

Views => RSSFeed => index.cshtml을 선택하시고 디버깅 해보시면 실행 결과를 볼 수 있습니다.

 

 

예제는 다음 URL에서 확인 해 보실 수 있습니다.

https://addsoft.co.kr/RSSFeed/Index 

 

애드소프트(Addsoft)

Addsoft는 당신의 비즈니스를 위한 아이디어를 구체적으로 실현할 수 있도록 노력을 더합니다. 작은 아이디어로 시작해 광고를 통한 수익을 창출 할 수 있도록 도와 줍니다. Addsoft는 아이디어를

addsoft.co.kr

 

원하는 내용이 없다고 놀라지 마시고 스크롤 좀만 내려주세요.

검색 후에도 처음 내용과 같이 보이니 스크롤 좀만 내려주세요.

홈페이지 만들다가 멈춰 둔 곳에 추가 해뒀습니다 ^^;

공용 레이아웃으로 배너를 넣어놧더니 수정하기 번거롭네요 ㅎㅎ

맨트가 개발중에 정해진게 없어서 생각나는대로 대충 넣어 놨더니 이상하게 보이네요.  _ _)

 

 

참 십쥬~ 

오늘 시간이 늦어 포스팅을 마치 도록 하겠습니다.

 

 

 

 

감사합니다.

반응형
반응형

개요


RecyclerView를 사용하면 대량의 데이터 세트를 효율적으로 표시할 수 있습니다. 개발자가 데이터를 제공하고 각 항목의 모양을 정의하면 RecyclerView 라이브러리가 필요할 때 요소를 동적으로 생성합니다.

이름에서 알 수 있듯이 RecyclerView는 이러한 개별 요소를 재활용합니다. 항목이 스크롤되어 화면에서 벗어나더라도 RecyclerView는 뷰를 제거하지 않습니다. 대신 RecyclerView는 화면에서 스크롤된 새 항목의 뷰를 재사용합니다. 이렇게 뷰를 재사용하면 앱의 응답성을 개선하고 전력 소모를 줄이기 때문에 성능이 개선됩니다.

메모리 사용량을 최소화하면서 UI에 많은 양의 데이터를 표시합니다.

 

주요 클래스

동적 목록을 만드는 데는 다양한 클래스가 함께 사용됩니다.

  • RecyclerView는 데이터에 해당하는 뷰가 포함된 ViewGroup입니다. 이는 뷰 자체이므로, 다른 UI 요소를 추가할 때처럼 레이아웃에 RecyclerView를 추가하면 됩니다.
  • 목록의 각 개별 요소는 뷰 홀더 객체로 정의됩니다. 뷰 홀더가 생성되었을 때는 뷰 홀더에 연결된 데이터가 없습니다. 뷰 홀더가 생성된 후 RecyclerView가 뷰 홀더를 뷰의 데이터에 바인딩합니다. RecyclerView.ViewHolder를 확장하여 뷰 홀더를 정의할 수 있습니다.
  • RecyclerView는 뷰를 요청한 다음, 어댑터에서 메서드를 호출하여 뷰를 뷰의 데이터에 바인딩합니다. RecyclerView.Adapter를 확장하여 어댑터를 정의할 수 있습니다.
  • 레이아웃 관리자는 목록의 개별 요소를 정렬합니다. RecyclerView 라이브러리에서 제공하는 레이아웃 관리자 중 하나를 사용하거나 레이아웃 관리자를 직접 정의할 수도 있습니다. 레이아웃 관리자는 모두 라이브러리의 LayoutManager 추상 클래스를 기반으로 합니다.

 

모든 요소가 RecyclerView 샘플 앱(Kotlin) 또는 RecyclerView 샘플 앱(자바)에서 조화를 이루며 작동하는지 확인할 수 있습니다.

 

android/views-widgets-samples

Multiple samples showing the best practices in views-widgets on Android. - android/views-widgets-samples

github.com

1. 종속성 등록

RecyclerView를 사용하기 위해서는 다음 종속성을 추가 하여야합니다.

다음과 같이 앱 또는 모듈의 build.gradle 파일에 필요한 아티팩트의 종속 항목을 추가합니다.

dependencies {
    implementation "androidx.recyclerview:recyclerview:1.1.0"
    // For control over item selection of both touch and mouse driven selection
    implementation "androidx.recyclerview:recyclerview-selection:1.1.0"
}

종속 항목에 관한 자세한 내용은 빌드 종속 항목 추가를 참고하세요.

 

2. RecyclerView 구현 단계

RecyclerView를 사용하려면 몇 가지 작업을 실행해야 합니다. 세부정보는 다음 섹션에 설명되어 있습니다.

  • 먼저 목록 또는 그리드의 모양을 결정합니다. 대개는 RecyclerView 라이브러리의 표준 레이아웃 관리자 중 하나를 사용할 수 있습니다.
  • 목록에 있는 각 요소의 모양과 동작 방식을 설계합니다. 이 설계에 따라 ViewHolder 클래스를 확장합니다. 사용 중인 ViewHolder 버전은 목록 항목에 필요한 모든 기능을 제공합니다. 뷰 홀더는 View의 래퍼이고 그 뷰는 RecyclerView로 관리됩니다.
  • 데이터를 ViewHolder 뷰와 연결하는 Adapter를 정의합니다.

RecyclerView를 정확한 요구 사항에 맞게 조정할 수 있는 고급 맞춤설정 옵션도 있습니다.

 

3. 레이아웃 계획

RecyclerView의 항목은 LayoutManager 클래스를 통해 정렬됩니다. RecyclerView 라이브러리는 가장 일반적인 레이아웃 상황을 처리하는 3가지 레이아웃 관리자를 제공합니다.

  • LinearLayoutManager는 항목을 1차원 목록으로 정렬합니다.
  • GridLayoutManager는 모든 항목을 2차원 그리드로 정렬합니다.
    • 그리드가 세로로 정렬된 경우 GridLayoutManager는 각 행의 모든 요소를 동일한 너비와 높이로 만들려고 하지만 행마다 높이가 다를 수 있습니다.
    • 그리드가 가로로 정렬되는 경우 GridLayoutManager는 각 열의 모든 요소를 동일한 너비와 높이로 만들려고 열마다 너비가 다를 수 있습니다.
  • StaggeredGridLayoutManager GridLayoutManager와 비슷합니다. 하지만 행의 항목이 동일한 높이(세로 그리드인 경우)이거나 동일한 열의 항목이 동일한 너비(가로 그리드인 경우)일 필요가 없습니다. 결과적으로 행 또는 열의 항목이 서로 오프셋 상태가 될 수 있습니다.

개별 항목의 레이아웃도 디자인해야 합니다. 다음 섹션에 설명된 것처럼 뷰 홀더를 설계할 때 이 레이아웃이 필요합니다.

 

 

4. 어댑터 및 뷰 홀더 구현

레이아웃을 결정했으면 Adapter  ViewHolder를 구현해야 합니다. 이 두 클래스가 함께 작동하여 데이터 표시 방식을 정의합니다. ViewHolder는 목록에 있는 개별 항목의 레이아웃을 포함하는 View의 래퍼입니다. Adapter는 필요에 따라 ViewHolder 객체를 만들고 이러한 뷰에 데이터를 설정하기도 합니다. 뷰를 데이터에 연결하는 프로세스를 바인딩이라고 합니다.

어댑터를 정의할 때는 다음 세 가지 키 메서드를 재정의해야 합니다.

  • onCreateViewHolder(): RecyclerView는 ViewHolder를 새로 만들어야 할 때마다 이 메서드를 호출합니다. 이 메서드는 ViewHolder와 그에 연결된 View를 생성하고 초기화하지만 뷰의 콘텐츠를 채우지는 않습니다. ViewHolder가 아직 특정 데이터에 바인딩된 상태가 아니기 때문입니다.
  • onBindViewHolder(): RecyclerView는 ViewHolder를 데이터와 연결할 때 이 메서드를 호출합니다. 이 메서드는 적절한 데이터를 가져와서 그 데이터를 사용하여 뷰 홀더의 레이아웃을 채웁니다. 예를 들어 RecyclerView가 이름 목록을 표시하는 경우 메서드는 목록에서 적절한 이름을 찾아 뷰 홀더의 TextView 위젯을 채울 수 있습니다.
  • getItemCount(): RecyclerView는 데이터 세트 크기를 가져올 때 이 메서드를 호출합니다. 예를 들어 주소록 앱에서는 총 주소 개수가 여기에 해당할 수 있습니다. RecyclerView는 이 메서드를 사용하여, 항목을 추가로 표시할 수 없는 상황을 확인합니다.

다음은 간단한 어댑터의 일반적인 예로, 이 어댑터에는 데이터 목록을 표시하는 중첩된 ViewHolder가 있습니다. 이 경우 RecyclerView는 텍스트 요소의 간단한 목록을 표시합니다. 어댑터에는 ViewHolder 요소의 텍스트가 포함된 문자열 배열이 전달됩니다.

 

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {

    private String[] localDataSet;

    /**
     * Provide a reference to the type of views that you are using
     * (custom ViewHolder).
     */
    public static class ViewHolder extends RecyclerView.ViewHolder {
        private final TextView textView;

        public ViewHolder(View view) {
            super(view);
            // Define click listener for the ViewHolder's View

            textView = (TextView) view.findViewById(R.id.textView);
        }

        public TextView getTextView() {
            return textView;
        }
    }

    /**
     * Initialize the dataset of the Adapter.
     *
     * @param dataSet String[] containing the data to populate views to be used
     * by RecyclerView.
     */
    public CustomAdapter(String[] dataSet) {
        localDataSet = dataSet;
    }

    // Create new views (invoked by the layout manager)
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        // Create a new view, which defines the UI of the list item
        View view = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.text_row_item, viewGroup, false);

        return new ViewHolder(view);
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(ViewHolder viewHolder, final int position) {

        // Get element from your dataset at this position and replace the
        // contents of the view with that element
        viewHolder.getTextView().setText(localDataSet[position]);
    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return localDataSet.length;
    }
}

각 뷰 항목의 레이아웃은 종전처럼 XML 레이아웃 파일에서 정의됩니다. 이 경우 앱에 다음과 같은 text_row_item.xml 파일이 들어 있습니다.

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="@dimen/list_item_height"
    android:layout_marginLeft="@dimen/margin_medium"
    android:layout_marginRight="@dimen/margin_medium"
    android:gravity="center_vertical">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/element_text"/>
</FrameLayout>

샘플 앱

 

android/sunflower

A gardening app illustrating Android development best practices with Android Jetpack. - android/sunflower

github.com

참고:

developer.android.com/guide/topics/ui/layout/recyclerview?hl=ko

 

반응형

+ Recent posts