2016년 5월 30일 월요일

Android Studio : 커스텀 뷰로 리스트 뷰 만들기

일단 이전에 "웹페이지 읽어오기" 상태를 기준으로 설명한다.

웹페이지 읽어오기 : http://son10001.blogspot.kr/2016/05/android-studio_30.html

요 상태에서...


커스텀 뷰 레이아웃을 하나 만들자.
레이아웃 항목에서 "Layout resource File" 메뉴를 선택해 파일을 만든다.
(물론 이건 조금이라도 타이핑 할 내용을 줄이기 위해서 하는거라서, 그냥 직접 XML 레이아웃을 다 쳐 넣어도 된다.)


만들 레이아웃 파일명을 넣고 확인.


그럼 이렇게 레이아웃 파일이 생성된다.


커스텀 레이아웃에 쓸 아이콘 이미지를 몇개 추가 한다.
아이콘 이미지 : 




완성된 레이아웃은 대충 이런 형태.
메인 타이틀, 서브 텍스트, 아이콘 이미지. 이렇게 3개의 항목이 하나의 셋인 리스트 뷰다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:layout_width="50dip"
        android:layout_height="50dip"
        android:id="@+id/imageView"
        android:src="@drawable/num01"
        android:layout_margin="5dip" />

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Title Text"
            android:id="@+id/textView"
            android:textSize="24dip"
            android:layout_marginLeft="5dip"
            android:layout_marginTop="5dip"
            android:layout_marginRight="5dip"
            android:layout_marginBottom="1dip" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Sub Text"
            android:id="@+id/textView2"
            android:textSize="16dip"
            android:layout_marginLeft="5dip"
            android:layout_marginTop="1dip"
            android:layout_marginRight="5dip"
            android:layout_marginBottom="5dip" />

    </LinearLayout>

</LinearLayout>

3개의 항목이 하나의 아이템으로 동작 할 것이므로, 클래스를 만들어 묶어 준다.


클래스를 추가하고.


이름을 적당하게 지정한다.


데이터 셋을 관리할 클래스이므로 이렇게 Getter / Setter 를 구현 해줌.

package com.son10001.formbasic;

public class ListItem {
    int image;
    String title;
    String sub;

    public ListItem ( int inImage, String inTitle, String inSub){
        this.image = inImage;
        this.title = inTitle;
        this.sub = inSub;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getSub() {
        return sub;
    }

    public void setSub(String sub) {
        this.sub = sub;
    }

    public int getImage() {
        return image;
    }

    public void setImage(int image) {
        this.image = image;
    }

}


그 다음에는


어뎁터를 구현해 준다.

참고 : http://son10001.blogspot.kr/2016/05/android-studio-listview.html

이전에 만들었던 리스트 뷰와 같은 방식으로 만들면 되는데, 단지 getView 가 좀더 복잡하고 addItem 이 데이터 셋을 넘겨서 여러 아이템을 한꺼번에 적용하는게 다르다.

이렇게 어뎁터 까지 구현해 줬으면...


이젠 메인 액티비티에서 써 먹으면 된다.

package com.son10001.formbasic;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.util.ArrayList;

public class BasicActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_basic);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        ListView listView = (ListView) findViewById(R.id.listView);
        MyAdapter adapter = new MyAdapter(this);
        listView.setAdapter(adapter);


        ArrayList<ListItem> items = new ArrayList<ListItem>();
        items.add(new ListItem(R.drawable.num01, "Title 01", "Sub 01"));
        items.add(new ListItem(R.drawable.num02, "Title 02", "Sub 02"));
        items.add(new ListItem(R.drawable.num03, "Title 03", "Sub 03"));
        items.add(new ListItem(R.drawable.num04, "Title 04", "Sub 04"));

        adapter.addItem(items);


        // 클릭이벤트
        findViewById(R.id.btnGetWeb).setOnClickListener(mClickListener);

    }





    Button.OnClickListener mClickListener = new View.OnClickListener() {
        public void onClick(View v) {
            try {
                new HttpUtil().execute();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };

    private URL Url;
    private String strUrl,strCookie,result;

    public class HttpUtil extends AsyncTask<Void, Void, Void> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            strUrl = "http://192.168.0.181:916/gettest.aspx";
        }

        @Override
        protected Void doInBackground(Void... voids) {
            try{
                Url = new URL(strUrl);
                HttpURLConnection conn = (HttpURLConnection) Url.openConnection();
                conn.setRequestMethod("GET");
                conn.setDoOutput(true);
                conn.setDoInput(true);
                conn.setUseCaches(false);
                conn.setDefaultUseCaches(false);

                strCookie = conn.getHeaderField("Set-Cookie");
                InputStream is = conn.getInputStream();

                StringBuilder builder = new StringBuilder();
                BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));
                String line;

                while ((line = reader.readLine()) != null) {
                    builder.append(line+ "\n");
                }

                result = builder.toString();
            }catch(MalformedURLException | ProtocolException exception) {
                exception.printStackTrace();
            }catch(IOException io){
                io.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            System.out.println(result);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_basic, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}



이렇게 하고 앱을 실행 해 보면...


요렇게 이쁜 리스트 뷰가 생성된다.