'listview'에 해당되는 글 2건

  1. 2010.08.28 [Widget] List View
  2. 2010.06.24 [Widget][예제]ListView with CursorAdaptor (3)
< 계속 업데이트 합니다. 질문 환영 >
10-06-18 초기 문서
10-08-28 팁 몇개 추가
10-11-30 팁 하나 추가

- Listview


말그대로 List이다. 한 개 이상의 항목을 담아 뿌려주는 것을 기본으로 한다.
ListView는 다소 복잡한 Control이나 빈번히 사용하게 될 Widget이다.
ListView의 보이는 영역은 Scrollbar, 각 Row Item들, Selector (구분자? seperator? ), Divisor 로 이루어진다.

Scrollbar
위 그림에서는 Gallery와 Grid에 걸쳐있는 회색 계통의 긴 막대를 말한다.
Scrollbar는 ScrollView를 참조하면 될 것 같다.

RowItem
각각의 Row에 저장하는 정보들을 표현한다. 여기에 저장할 수 있는 정보는 매우 다양할 수 있기 때문에 다양한 Adaptor 형태로 ListView에 제공된다.
가장 기본 적인 것은 ArrayAdaptor이고, Database를 위해 CursorAdaptor도 제공한다.
사용자가 직접 재정의해서 다양한 정보들을 넣을 수 있다.

android.R.layout.simple_list_item_1
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2006 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
 
          http://www.apache.org/licenses/LICENSE-2.0
 
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:gravity="center_vertical"
    android:paddingLeft="6dip"
    android:minHeight="?android:attr/listPreferredItemHeight"
/>

Selector
Selector는 위 그림에서 Grid와 같이 사용자가 선택된 것을 알려주는 역할을 수행한다. 기본은 노란색 배경이라 너무 눈에 튀기 때문에 적당히 자신만의 Selector를 쓰는게 좋다.

Divisor
Divisor는 각 RowItem을 구분하는 역할을 하는 선을 말한다.

SectionIndexer, AlphabetIndexer
http://www.androidpub.com/97392
 

1) 만드는 법
   -
2) Adaptor 정리

3) style 바꾸는 법
   - selector 바꾸는 법
     selector를 바꾸는 법은 쉽다. 함수를 사용할 경우,
     mListView.setSelector(myDrawable);
   - background, foregound 바꾸는 법


4)

5) TIP
 a] 배경이 있는 Listview를 스크롤시, 회색이 나오는 문제
   android:cacheColorHint="#00000000" 을 추가
 b) 만약, listview의 아이템을 선택할 때 한 줄이 선택되지 않고 일부만 선택된다면 (textview가 있는 영역만 선택된다면)
   ListView의 layout_width="fill_parent" 속성을 확인할 것
 c) Custom ListView에서 Selector가 안보인다면,
   Selector의 기본 옵션은 Row 아래 깔리도록 되어 있는 것 같다. ListView 속성  
   android:drawSelectorOnTop="true"을 준다.
 d) ListView 아래 라인(Divisor) 제거하기
   listview.setDivisor(null);
 e) ListView 위아래 흐림 효과 막기
   android:fadingEdge="none"

6) 문제 해결
 setOnItemClickListener 가 동작하지 않을 때
 => 커스텀 뷰를 만들어서 쓸 경우, setOnItemClickListener가 동작하지 않는 경우가 발생했다. 문제는 커스텀 뷰에서 이벤트를 소비하고 있기 때문인데, 소비하는 부분을 찾아 제거해주는 것이 필요하다. 나의 경우, TextView와 marque 때문에 이런 문제가 발생했다. 3시간 소비 -_-;

* ListView 안의 custom textview에서 Ellipsize 쓰려면
    android:scrollHorizontally="true"
    http://stackoverflow.com/questions/1424276/ellipsize-not-working-for-textview-inside-custom-listview

참고 자료
http://android-developers.blogspot.com/2009/01/why-is-my-list-black-android.html : 배경이 검게 나오는 것과 관련한 자료
http://blog.naver.com/PostView.nhn?blogId=kippee&logNo=130076565197&viewDate=&currentPage=1&listtype=0&userTopListOpen=false&userTopListCount=5&userTopListManageOpen=false&userTopListCurrentPage=undefined
http://www.androidguys.com
http://comma.byus.net/blog/2younow/trackback/6
신고
Posted by 소혼
SimpleCursorAdaptor와 ListView의 사용예
Activity를 MyList.java로 만들고 아래 코드들을 추가
DB는 단순하게 사용하였음


### xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<ListView android:id="@+id/IndexList"
        android:layout_width="fill_parent" android:layout_height="fill_parent"/>
</LinearLayout>

main.xml

### java

package com.yesum.listDBSample;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.CursorAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.AdapterView.OnItemClickListener;

public class MyList extends Activity {
    private static final String DATABASE_NAME = "sample.db";
    public static final String TABLE_NAME = "mytable";
    private static final String COLUMN_KEY_ID = "_id";
    private static final String COLUMN_NAME = "name";

    private ListView m_listIndex;
    private SQLiteDatabase mDatabase;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        m_listIndex = (ListView) this.findViewById(R.id.IndexList);
        m_listIndex.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
            }
        });
        //createDB();
        //insert("ryuan");
        //insert("yesum");
        //insert("dongsik");
        setAdaptor();
    }

    private long insert(String name) {
        if (mDatabase == null) {
            mDatabase = openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null);
        }
        ContentValues cv = new ContentValues();
        cv.put(COLUMN_NAME, name);
        return mDatabase.insert(TABLE_NAME, null, cv);
    }

    private void createDB() {
        // create sample DB
        if (mDatabase == null) {
            mDatabase = openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null);
        }
        String createSQL = "CREATE TABLE " + TABLE_NAME + " (_id integer primary key, " +
            "name)";
        mDatabase.execSQL(createSQL);

    }

    private void setAdaptor() {
        if (mDatabase == null) {
            mDatabase = openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null);
        }
        Cursor cursor = null;
        final CursorAdapter adaptor;
        String[] columns = new String[] {COLUMN_KEY_ID, COLUMN_NAME};

        cursor = mDatabase.query(TABLE_NAME, columns, null, null, null, null, null);
        adaptor = new SimpleCursorAdapter(this,
                android.R.layout.simple_list_item_1,
                cursor,
                new String[] {COLUMN_NAME},
                new int[] {android.R.id.text1}
                );
       
        m_listIndex.setAdapter(adaptor);
    }
}

MyList.java

신고
Posted by 소혼
이전버튼 1 이전버튼

티스토리 툴바