[ListView #4] 사용자 Layout을 이용한 List

Posted by [하늘이]
2010. 11. 25. 16:27 IT/Android[안드로이드]
반응형
이전에는 
ArrayAdapter<String> adapter = new ArrayAdapter<String>
(this, android.R.layout.simple_list_item_1, mArrayList);

제공되는 기본 List형으로 했으나 이번에는 사용자가 만든 Layout을 이용하여,
리스트를 만들어보자.

리스트 하나에 두개의 줄로 이루어져 있는 리스트를 만들어보자.
  [리스트의 하나에 두줄을 넣고 첫번째줄은 큰글씨, 두번째 줄은 작은 글씨로 이루어져있는 리스트임]

----------------------------------------------------------------------
1. Activity를 구성하는 Layout 을 만든다 
이때 ListView가 포함되어 있어야 된다. [지금은 여러가지 하면 보기 힘드니 ListView만
추가된 것으로 만듬.]

repeat_menu_load_list.xml

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

----------------------------------------------------------------------
2. 위 layout에서 ListView에 적용할 List 형태의 Layout을 추가한다.
즉 리스트 하나에 대한 형태를 구성하는 것이다.
[큰 글씨 라인 하나와 작은 글씨 라인 하나가 있는 구성이 된다.]

repeat_menu_load_list_row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:gravity="center_vertical"
    android:paddingLeft="16dip"
    android:paddingRight="?android:attr/scrollbarSize">
  <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="6dip"
        android:layout_marginTop="6dip"
        android:layout_marginBottom="6dip"
        android:layout_weight="1">
    
        <TextView android:id="@+id/repeatMenuLoadListTag"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:textAppearance="?android:attr/textAppearanceLarge" />
            
        <TextView android:id="@+id/repeatMenuLoadListFilename"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/repeatMenuLoadListTag"
            android:layout_alignLeft="@id/repeatMenuLoadListTag"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:maxLines="2" />
    </RelativeLayout>
</LinearLayout>

----------------------------------------------------------------------
3. 이제 Activity에 적용한다.
[ListActivity를 사용해도 되지만 지금은 Activity를 상속 받은 것으로 진행]

public class RepeatMenuLoadList extends Activity {
   private static final String Tag = "RepeatMenuLoadList";

   private ListView mListView;
   private LoadListAdapter mListAdapter;
   private ArrayList <PlayerRepeatABInfo> mArrayData; 

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.repeat_menu_load_list);
    
      mArrayData = new ArrayList<PlayerRepeatABInfo>();
      mListView = (ListView)findViewById(R.id.repeatMenuLoadLV);
 
      //user의 list layout을 적용할 Adapter 생성하면서, 
      //사용할 Layout, ArrayList 데이타를 전달한다.

      mListAdapter = new LoadListAdapter(this, 
                          R.layout.repeat_menu_load_list_row, mArrayData);
      mListView.setAdapter(mListAdapter);
}
...............
   @Override
   //리스트 나오는 것을 임시로 보기 위해서 ArrayList의 Data를 세팅한다.
   protected void onResume() {
      super.onResume();
      //For Testing
      {
         PlayerRepeatABInfo a = new PlayerRepeatABInfo("TestPath/asdfasd/Tag_A", 12345);
         a.setTagOfUser("Tag ~~!!!!!A");
         mArrayData.add(a);
         //변경된 데이타가 있다는 것을 Adapter에 알린다.
        
mListAdapter.notifyDataSetChanged();   
    
      }
   }
----------------------------------------------------------------------
4. List 하나에 적용되는 layout에 대한 Class를 구성한다.
3번에 나오는 Class 내부에 Sub Class로 만들어도 되며, Class 파일을 새로 만들어도 된다.
다만, 이 Class는 ArrayAdapter<E> 을 상속 받아야 된다.

public class LoadListAdapter extends ArrayAdapter<PlayerRepeatABInfo>{
   private int mnRid;

   //생성자를 구성할 때 ArrayList 데이타를 super에 매핑시켜야 된다. 
   //이것을 제외하고 2개의 인자만 
받아서 생성자를 구성하고 super에 
   //넘겨주면, 리스트가 안나오게된다. 한참 삽질하게 되는 수가 있다.
   public LoadListAdapter(Context context, int textViewResourceId,
               List<PlayerRepeatABInfo> objects) {
      super(context, textViewResourceId, objects);
      mnRid =textViewResourceId;
   }
   @Override
   //리스트를 그리면서 자동으로 호출되는 메서드임.
   //여기에서 List의 내용을 채우면 된다.
   public View getView(int position, View convertView, ViewGroup parent) {
      View listView = convertView;
      PlayerRepeatABInfo repeatData = getItem(position);
      if (listView == null) {
         LayoutInflater vi = (LayoutInflater)mContext.getSystemService
                                 (Context.LAYOUT_INFLATER_SERVICE);
         listView = vi.inflate(R.layout.repeat_menu_load_list_row, null);
      }
      //리스트에 적용할 데이타를 가져온다.
      String sTag = repeatData.getTagOfUser();
      String sFilename = repeatData.getFilePath();
      
     
//Layout에 추가된 TextView들을 가져와 String을 적용한다.
      TextView tvTag = (TextView)listView.findViewById
                                 (R.id.repeatMenuLoadListTag);
      TextView tvFilename = (TextView)listView.findViewById
                                 (R.id.repeatMenuLoadListFilename);
      tvTag.setText(sTag);
      tvFilename.setText(sFilename);
      return listView;
   }

위 4단계만을 해주면, 리스트 구성하는데 크게 무리가 없을 듯합니다.
굵은 글씨와 색칠된 것들을 잘 적용하면 됩니다.
-----------------------------------------------------------------------
PlayerRepeatABInfo 은 그냥..데이타를 저장하고 읽어 올 수 있게 만든 객체입니다.
혹시 이것의 내용을 보고 싶으신분 들을 위해서 대략 내용을 추가해 드리겠습니다.

public class PlayerRepeatABInfo
{
private static final String Tag = "PlayerRepeatABInfo";
private long mTotalTime;
private long mStartPosition;
private long mEndPosition;
private String mFilePath;
private byte mIsSetRepeatInfo;
private String mTagOfUser;
public PlayerRepeatABInfo(String fullPath, long totalTime) {
mFilePath = fullPath;
mIsSetRepeatInfo = 0;
mTotalTime = totalTime;
mStartPosition = 0;
mEndPosition = 0;
mTagOfUser = null;
}
.........
public void setTagOfUser(String sTag){
mTagOfUser = sTag;
}

public String getTagOfUser(){
return mTagOfUser;
}
..............
--------------------------------------------

완성된 이미지를 보여드리고 싶지만, 파일을 올릴수 있는 상황이 아니라서 ....ㅜㅜ
반응형