반응형

개요

안드로이드 개발을 하다보면 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

 

반응형
반응형

Overview


Android 7.0 부터는 CardView API가 기본적으로 제공합니다.

CardView는 RecyclerView 내의 레이아웃에 사용되는 컨테이너 입니다.

카드를 사용하면 간편하게 컨테이너의 스타일을 일관되게 유지하면서 뷰 그룹을 포함할 수 있습니다.

 

그림1. 카드 예

 


카드 만들기

종속성 추가(Add the dependencies)

CardView 위젯은 AndroidX의 일부입니다.

CardView를 사용하기 위해서는 build.gradle 파일의 AndroidX 라이브러리에서 CardView를 가져와야 합니다.

    dependencies {
        implementation "androidx.cardview:cardview:1.0.0"
    }    

CardView를 사용하려면 레이아웃 파일에 추가해야 합니다. 다른 뷰를 포함하려면 CardView를 뷰 그룹으로 사용합니다. 

 

레이아웃이 다음과 같다고 가정 해 보겠습니다.

<androidx.cardview.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <!-- Main Content View -->
    <androidx.constraintlayout.widget.ConstraintLayout>
        ...
    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>

 

CardView 사용자 정의

CardView카드가 플랫폼 전체에서 일관된 모양을 갖도록 기본 고도 및 모서리 반경을 제공합니다. 그러나 원하는 경우 이러한 값을 사용자 정의 할 수 있습니다. 카드의 배경색도 설정할 수 있습니다.

 

<androidx.cardview.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    card_view:cardBackgroundColor="#E6E6E6"
    card_view:cardCornerRadius="8dp"
    card_view:cardElevation="8dp">

    <!-- Main Content View -->
    <androidx.constraintlayout.widget.ConstraintLayout>
        ...
    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>

카드는 기본 고도로 화면에 그려지며, 시스템은 카드 아래에 그림자를 그립니다. card_view:cardElevation 속성을 사용하여 카드에 맞춤 고도를 제공할 수 있습니다. 고도가 커지면 그림자가 진하게 그려지고 고도가 낮아지면 그림자가 연하게 그려집니다. CardView는 Android 5.0(API 수준 21) 이상에서 실제 고도와 동적 그림자를 사용하고 그 이전 버전에서는 프로그래매틱 방식으로 그림자를 구현합니다.

다음 속성을 사용하여 CardView 위젯의 모양을 맞춤설정합니다.

  • 레이아웃에서 모서리 반경을 설정하려면 card_view:cardCornerRadius 속성을 사용합니다.
  • 코드에서 모서리 반경을 설정하려면 CardView.setRadius 메서드를 사용합니다.
  • 카드의 배경색을 설정하려면 card_view:cardBackgroundColor 속성을 사용합니다.

Ripple 이펙트 추가하기

기본적으로 CardView는 선택할 수 없으며 터치시 피드백을 표시하지 않습니다. 터치 피드백 애니메이션은 CardView를 터치 할때 시각적으로 피드백을 사용자에게 제공합니다. 이동작을 활성화하려면 다음 속성을 등록해야합니다.

<androidx.cardview.widget.CardView
  ...
  android:clickable="true"
  android:foreground="?android:attr/selectableItemBackground">
  ...
</androidx.cardview.widget.CardView>

android:foreground="?android:attr/selectableItemBackground" 속성을 CardView에 사용하면 Ripple 이펙트 효과를 추가 할 수 있습니다.

 

참고

반응형

+ Recent posts