RecyclearView 사용 시 문제 해결 방법

17305 단어 RecyclerViewAndroid
안드로이드L에는 진화형 와이시트ListView가 추가됐다.RecyclerView에 대해 조사한 결과RecyclerView와 비교하면
  • 성능 향상
  • 사용 편의성 향상
  • 이런 보도가 눈에 들어왔다.
    실제 상황이 어떠한지 사용하기 전의 절차와 주의한 일을 모두 써야 한다.
    ※ 본 기사는 다음과 같은 환경에서 실시됩니다.
    IDE: Android Studio 0.8.8
    Java: 1.6.0_65
    ※ 안드로이드 디벨로퍼스에는 ListView의 훈련Creating Lists and Cards이 있습니다.

    compileSdkVersion android-L의 회피 방법


    Android Studio에서 새 ProjectRecyclerViewMinimum SDK로 설정합니다.
    제작시build입니다.gradle을 확인한 후 아래와 같다.
    build.gradle
    android {
        compileSdkVersion 'android-L'
        buildToolsVersion "20.0.0"
    
        defaultConfig {
            applicationId "jp.co.samril.myapplication"
            minSdkVersion 'L'
            targetSdkVersion 'L'
            versionCode 1
            versionName "1.0"
        }
        ...
    }
    
    실제로 이렇게 만든 프로젝트를 컴파일하면 다음과 같은 오류가 발생합니다.
    Error:compileSdkVersion android-L requires compiling
    찾아보니 버그인 것 같아요.
    [How-to] Use the v21 Support Libs on Older Versions & Target L While Remaining Backwards-Compatible
    build.그레이드를 아래처럼 수정하면 돼요.
    build.gradle
    android {
        compileSdkVersion 20 // ★ここを整数に
        buildToolsVersion "20.0.0"
    
        defaultConfig {
            applicationId "jp.co.samril.myapplication"
            minSdkVersion 'L'
            targetSdkVersion 'L'
            versionCode 1
            versionName "1.0"
        }
        ...
    }
    

    낮은 SDK로 컴파일하는 방법

    API 20+: Android L는 안드로이드 L에서 추가된 Wisit이므로 SDK Version이 20 이상이어야 합니다.
    build.gradle의 RecyclerView에 다음 내용을 설정합니다
    build.gradle
    dependencies {
        compile 'com.android.support:support-v4:20.+'
        compile 'com.android.support:recyclerview-v7:+'
    }
    
    낮은 SDK를 실제로 설정하면 다음과 같은 컴파일 오류가 발생합니다.
    Error:Execution failed for task '...'.
    > Manifest merger failed : uses-sdk:minSdkVersion 14 cannot be smaller than version L declared in library com.android.support:support-v4:21.0.0-rc1
    이걸 해제하려면 안드로이드 매니페스트.xml에 dependencies의 설정을 추가하면 됩니다.
    AndroidManifest.xml
    <manifest
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="jp.co.homes.android3" >
    
        <uses-sdk tools:node="replace" />
    
        ...
    
    추가uses-sdkxmlns:tools="http://schemas.android.com/tools".
    이렇게 하면Gradle의 빌딩이 통과할 수 있습니다.

    배치를 구성할 때 미리 보기를 볼 수 없습니다.


    레이아웃 파일에서 일반적인 <uses-sdk tools:node="replace" /> 과 같은 설명을 사용할 수 있습니다.
    layout.xml
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/my_recycler_view"
            android:scrollbars="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
    </LinearLayout>
    
    다만, 프리뷰를 확인할 때ListView가 발생한다.
    Rendering Problems
    The new RecyclerView does not yet work in Studio. We are working on a fix. ( Open Issue 72117 , Show Exception)
    링크에 명시된 대로 Android Studio가 아직 실행되지 않은 것 같습니다java.lang.NullPointerException.스케줄러:정말?

    표시할 때 발생하는 NullPoint erException을 방지하는 방법


    삽입RecyclerView 및 순조롭게 구축.
    그러면 실기와 지니모션으로 동작을 확인하기 위해 화면을 표시할 때RecyclerView가 붕괴됐다.
    java.lang.NullPointerException
            at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:1310)
            at android.view.View.measure(View.java:16497)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
        ...
    
    찾아보니 이것도 안드로이드 스튜디오의 버그...
    Using CardView and RecyclerView in my layout files throws an exception
    원인은 아직 초기화되지 않은 것 같다java.lang.NullPointerException.
    회피 방법은 다음과 같다.
    ***Activity.java
    RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.my_recycler_view);
    recyclerView.setHasFixedSize(true); // RecyclerViewのサイズを維持し続ける
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    
    이 설치는 RecyclerView 또는 onCreate()에 추가됩니다.
    이렇게 하면 NullPoint erException을 피할 수 있습니다.

    줄 사이에 구분선을 표시하는 방법

    onCreateView()에서 RecyclerView를 그릴 때 줄 사이의 구분선은 표시되지 않습니다.

    이를 피하기 위해 RecyclerView.ItemDecoration를 사용하십시오.
    RecyclerView.ItemDecoration 소개
    어댑터가 설정한 특정 뷰에 드로잉 및 레이아웃을 추가할 수 있습니다.
    예를 들어 이번과 같은 분리선과 하이라이트 등은 다양한 표현을 할 수 있다
    참조https://gist.github.com/alexfu/0f464fc3742f134ccd1e는 다음 범주를 만듭니다.
    MyItemDecoration.java
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.Canvas;
    import android.graphics.Rect;
    import android.graphics.drawable.Drawable;
    import android.support.v7.widget.RecyclerView;
    import android.view.View;
    
    /**
     * Created by samukaak on 2014/11/20.
     */
    public class MyItemDecoration extends RecyclerView.ItemDecoration {
    
        private static final int[] ATTRS = new int[]{
                android.R.attr.listDivider
        };
    
        private Drawable mDivider;
    
        public MyItemDecoration(final Context context) {
            final TypedArray array = context.obtainStyledAttributes(ATTRS);
            mDivider = array.getDrawable(0);
            array.recycle();
        }
    
        @Override
        public void getItemOffsets(final Rect outRect, final int itemPosition, final RecyclerView parent) {
            outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
        }
    
        @Override
        public void onDraw(final Canvas c, final RecyclerView parent) {
            drawVertical(c, parent);
        }
    
        public void drawVertical(final Canvas c, final RecyclerView parent) {
            final int left = parent.getPaddingLeft();
            final int right = parent.getWidth() - parent.getPaddingRight();
    
            final int childCount = parent.getChildCount();
            for (int i = 0; i < childCount; i++) {
                final View child = parent.getChildAt(i);
                final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                        .getLayoutParams();
                final int top = child.getBottom() + params.bottomMargin;
                final int bottom = top + mDivider.getIntrinsicHeight();
                mDivider.setBounds(left, top, right, bottom);
                mDivider.draw(c);
            }
        }
    }
    
    android.R.layout.simple_list_item_1로 그걸 설정하세요.
    ***Activity.java
    recyclerView.addItemDecoration(new MyItemDecoration(getActivity()));
    

    참고 자료
  • commpileSdkVersion을 "android-L"로 설정한 후 INSTALLFAILED_OLDER_SDK 발생
  • ICS에서 RecyclearView 사용 방법
  • RecyclerView in Android: The basics
  • https://github.com/baoyongzhang/RecyclerViewDemo/wiki/Introduce
  • RecyclearView에서 줄 사이에 구분선 표시
  • 좋은 웹페이지 즐겨찾기