programing

Android List행별로 다른 레이아웃을 가진 보기

minimums 2023. 9. 25. 22:28
반응형

Android List행별로 다른 레이아웃을 가진 보기

행별로 다른 레이아웃을 포함하는 단일 ListView를 가질 수 있는 가장 좋은 방법을 결정하려고 합니다.전체 목록 보기에 대한 사용자 지정 행을 지원하는 사용자 지정 행 + 사용자 지정 배열 어댑터를 만드는 방법은 알고 있지만 목록 보기에서 다양한 행 스타일을 구현하려면 어떻게 해야 합니까?

배치 유형이 몇 개인지 알고 있으므로 이러한 방법을 사용할 수 있습니다.

getViewTypeCount()이 행 합니다에 합니다.

getItemViewType(int position)합니다를 에 대한 합니다.

null 합니다를 합니다.getItemViewType.

자세한 내용은 이 자습서를 참조하십시오.

코멘트에서 설명한 구조의 최적화를 달성하기 위해 다음과 같이 제안하고자 합니다.

  • 하는 중입니다.ViewHolder가 없기 . 입니다.findViewById()에 있어서는 언제나getView방법.API 데모에서 목록 14를 참조합니다.
  • 속성의 모든 조합을 적합하게 만들고 현재 위치에 속성이 없는 경우 일부 요소를 숨길 일반 레이아웃을 만듭니다.

그것이 당신에게 도움이 되기를 바랍니다.데이터 구조와 행에 정확히 매핑할 방법에 대한 정보를 XML stub에 제공해 주신다면 좀 더 정확한 조언을 드릴 수 있을 것 같습니다.픽셀 단위로.

전체 목록 보기에 대한 사용자 지정 행을 지원하는 사용자 지정 행 + 사용자 지정 어레이 어댑터를 만드는 방법을 알고 있습니다.그러나 어떻게 하나의 리스트뷰가 여러 가지 다른 행 스타일을 지원할 수 있습니까?

당신은 이미 기본적인 것을 알고 있습니다.제공되는 행/커서 정보에 따라 다른 레이아웃/뷰를 반환하도록 사용자 지정 어댑터를 지정하기만 하면 됩니다.

A ListViewAdapterView에서 파생되었기 때문에 여러 행 스타일을 지원할 수 있습니다.

어댑터 보기는 어댑터에 의해 자식이 결정되는 보기입니다.

어댑터를 보면 행별 보기를 사용하는 방법을 알 수 있습니다.

abstract int getViewTypeCount()
// Returns the number of types of Views that will be created ...

abstract int getItemViewType(int position)
// Get the type of View that will be created ...

abstract View getView(int position, View convertView, ViewGroup parent)
// Get a View that displays the data ...

후자의 두 가지 방법은 해당 사용 유형을 결정하는 데 사용할 수 있도록 위치제공합니다.


물론 일반적으로 AdapterView 및 Adapter를 직접 사용하지 않고 하위 클래스 중 하나를 사용하거나 파생합니다.어댑터의 하위 클래스는 다른 행에 대한 사용자 지정 레이아웃을 가져오는 방법을 변경하는 추가 기능을 추가할 수 있습니다.지정된 행에 사용되는 뷰는 어댑터가 구동하므로 어댑터가 지정된 행에 대해 원하는 뷰를 반환하도록 하는 것이 좋습니다.이 방법은 어댑터에 따라 다릅니다.

예를 들어 ArrayAdapter를 사용하려면,

  • 를 무시하다getView()주어진 위치에 대해 원하는 뷰를 부풀리고 채우고 반환합니다.getView()됩니다.convertView매개 변수.

하지만 Cursor Adapter의 파생 제품을 사용하기 위해서는

  • 를 무시하다newView()현재 에 태즉을 들어, 행"재)면을 다].bindView위젯이 보기를 재사용할 수 있도록 합니다.]

그러나 SimpleCursor Adapter를 사용하려면,

  • 정의를 내리다SimpleCursorAdapter.ViewBindersetViewValue()주어진 행(현재 커서 상태) 및 데이터 "열"에 대해 원하는 뷰를 부풀리고 채우고 반환하는 방법.메서드는 "특수" 보기만 정의하고 "정상" 바인딩에 대해 SimpleCursorAdapter의 표준 동작을 수행할 수 있습니다.

최종적으로 사용하게 되는 어댑터 종류에 대한 구체적인 예/자습서를 찾아보십시오.

아래 코드를 보세요.

먼저 사용자 지정 레이아웃을 만듭니다.이 경우에는 네 가지 유형이 있습니다.

even.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:background="#ff500000"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/text"
        android:textColor="@android:color/white"
        android:layout_width="match_parent"
        android:layout_gravity="center"
        android:textSize="24sp"
        android:layout_height="wrap_content" />

 </LinearLayout>

odd.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:background="#ff001f50"
    android:gravity="right"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/text"
        android:textColor="@android:color/white"
        android:layout_width="wrap_content"
        android:layout_gravity="center"
        android:textSize="28sp"
        android:layout_height="wrap_content"  />

 </LinearLayout>

white.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:background="#ffffffff"
    android:gravity="right"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/text"
        android:textColor="@android:color/black"
        android:layout_width="wrap_content"
        android:layout_gravity="center"
        android:textSize="28sp"
        android:layout_height="wrap_content"   />

 </LinearLayout>

black.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:background="#ff000000"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/text"
        android:textColor="@android:color/white"
        android:layout_width="wrap_content"
        android:layout_gravity="center"
        android:textSize="33sp"
        android:layout_height="wrap_content"   />

 </LinearLayout>

그런 다음 목록 보기 항목을 만듭니다.저희 같은 경우는 끈이랑 타입으로.

public class ListViewItem {
        private String text;
        private int type;

        public ListViewItem(String text, int type) {
            this.text = text;
            this.type = type;
        }

        public String getText() {
            return text;
        }

        public void setText(String text) {
            this.text = text;
        }

        public int getType() {
            return type;
        }

        public void setType(int type) {
            this.type = type;
        }

    }

그런 다음 뷰 홀더를 만듭니다.Android OS에서는 항목이 사라지면 재사용하기 위해 레이아웃 참조를 유지하고 화면에 다시 나타나므로 이를 강력하게 권장합니다.이 방법을 사용하지 않으면 Android OS가 화면에 나타날 때마다 새 항목이 생성되어 앱에서 메모리가 유출됩니다.

public class ViewHolder {
        TextView text;

        public ViewHolder(TextView text) {
            this.text = text;
        }

        public TextView getText() {
            return text;
        }

        public void setText(TextView text) {
            this.text = text;
        }

    }

마지막으로 getView를 재정의하는 사용자 지정 어댑터를 생성합니다.카운트()를 입력하고 getItemViewType(int위치)을 가져옵니다.

public class CustomAdapter extends ArrayAdapter {

        public static final int TYPE_ODD = 0;
        public static final int TYPE_EVEN = 1;
        public static final int TYPE_WHITE = 2;
        public static final int TYPE_BLACK = 3;

        private ListViewItem[] objects;

        @Override
        public int getViewTypeCount() {
            return 4;
        }

        @Override
        public int getItemViewType(int position) {
            return objects[position].getType();
        }

        public CustomAdapter(Context context, int resource, ListViewItem[] objects) {
            super(context, resource, objects);
            this.objects = objects;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            ViewHolder viewHolder = null;
            ListViewItem listViewItem = objects[position];
            int listViewItemType = getItemViewType(position);


            if (convertView == null) {

                if (listViewItemType == TYPE_EVEN) {
                    convertView = LayoutInflater.from(getContext()).inflate(R.layout.type_even, null);
                } else if (listViewItemType == TYPE_ODD) {
                    convertView = LayoutInflater.from(getContext()).inflate(R.layout.type_odd, null);
                } else if (listViewItemType == TYPE_WHITE) {
                    convertView = LayoutInflater.from(getContext()).inflate(R.layout.type_white, null);
                } else {
                    convertView = LayoutInflater.from(getContext()).inflate(R.layout.type_black, null);
                }

                TextView textView = (TextView) convertView.findViewById(R.id.text);
                viewHolder = new ViewHolder(textView);

                convertView.setTag(viewHolder);

            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }

            viewHolder.getText().setText(listViewItem.getText());

            return convertView;
        }

    }

그리고 우리의 활동은 다음과 같습니다.

private ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main); // here, you can create a single layout with a listview

        listView = (ListView) findViewById(R.id.listview);

        final ListViewItem[] items = new ListViewItem[40];

        for (int i = 0; i < items.length; i++) {
            if (i == 4) {
                items[i] = new ListViewItem("White " + i, CustomAdapter.TYPE_WHITE);
            } else if (i == 9) {
                items[i] = new ListViewItem("Black " + i, CustomAdapter.TYPE_BLACK);
            } else if (i % 2 == 0) {
                items[i] = new ListViewItem("EVEN " + i, CustomAdapter.TYPE_EVEN);
            } else {
                items[i] = new ListViewItem("ODD " + i, CustomAdapter.TYPE_ODD);
            }
        }

        CustomAdapter customAdapter = new CustomAdapter(this, R.id.text, items);
        listView.setAdapter(customAdapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView adapterView, View view, int i, long l) {
                Toast.makeText(getBaseContext(), items[i].getText(), Toast.LENGTH_SHORT).show();
            }
        });

    }
}

이제 mainactivity.xml 안에 리스트뷰를 만듭니다.

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="com.example.shivnandan.gygy.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_main" />

    <ListView
        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:id="@+id/listView"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"


        android:layout_marginTop="100dp" />

</android.support.design.widget.CoordinatorLayout>

사용자 지정 어레이 어댑터에서는 익숙한 것처럼 getView() 메서드를 재정의합니다.그러면 getView 메서드에 전달된 position 인수에 따라 switch 문 또는 if 문을 사용하여 특정 customView를 반환하기만 하면 됩니다.Android는 사용자의 위치/열에 적합한 유형의 변환 보기만 제공한다는 점에서 영리합니다. 올바른 유형인지 확인할 필요가 없습니다.getItemViewType() 및 getView를 재정의하여 Android에서 이 문제를 해결할 수 있습니다.Count() 메서드를 적절하게 입력합니다.

목록 보기에 다른 유형의 보기를 표시해야 하는 경우 getView를 사용하는 것이 좋습니다.보기 보기를 토글하는 대신 어댑터에 카운트()를 입력하고 getItemViewType()을 가져옵니다.가셔서 보세요.VISILE은 getView() 내부에서 매우 값비싼 작업일 수 있으며, 이 작업은 목록 스크롤에 영향을 미칠 수 있습니다.

getView를 사용하려면 이 항목을 확인하십시오.어댑터에 카운트()를 입력하고 getItemViewType()을 가져옵니다.

링크 : 겟뷰의 사용 형태

ListView는 모든 행 항목에 대해 동일한 정적 뷰와 같은 단순한 사용 사례를 대상으로 합니다.
보기를 만들어야 하기 때문에보유자 및 중요한 활용getItemViewType(), 그리고 다른 행 항목 레이아웃 xml을 동적으로 보여주므로 Android API 22에서 사용할 수 있는 RecyclerView를 사용하여 이를 시도해야 합니다.여러 뷰 유형을 보다 잘 지원하고 구조화할 수 있습니다.

리사이클러 보기를 사용하여 원하는 작업을 수행하는 방법에 대한 이 자습서를 확인하십시오.

언급URL : https://stackoverflow.com/questions/4777272/android-listview-with-different-layouts-for-each-row

반응형