Android

Android - ListView and Adapter

TechNote.kr 2016. 1. 9. 00:08
728x90

android app을 시작하면서 adapter라는 개념이 잘 와닿지 않았다. 

list를 만들기 위해서 listview에 data를 넘겨주면 자동으로 보여주면 되지, data를 adapter에 연결하고, 이를 다시 listview에 연결하고, 대체 왜 이 adapter라는게 필요한지 잘 이해가 안갔다. 


자료를 좀 찾아보니 data(Text, Image 등)별로 처리하는 방법이 다 다를테고, 그렇다고 view마다 해당 data에 대한 처리 routine을 구현해야 한다면 view마다 동일 내용을 일일이 넣어 줘야 하는 불상사가 생긴다.


즉, view에 넘겨주는 부분은 adapter라는 class로 일원화 시키고, data에 따른 구현은 해당 adapter class를 extend시켜 하나의 class로 구현해 주도록 한 것이었다.


데이터(Data) -------  어댑터(Adapter) --------- 뷰(View) 

BaseAdapter : 모든 Adapter의 기본이 되는 class로 abstract class이다.


ArrayAdapter : Array(배열) 혹은 컬렉션(Collection)으로 부터 Data를 가져옴

CursorAdapter : DB(Database)로 부터 Data를 가져옴

SimpleAdapter : (Image같은) Static Data 


[예]


    private ListView                m_ListView;

    private ArrayAdapter<string>    m_Adapter;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

         

        // Android에서 제공하는 string 문자열 하나를 출력 가능한 layout으로 어댑터 생성

        m_Adapter = new ArrayAdapter<string>(getApplicationContext(), android.R.layout.simple_list_item_1);

         

        // Xml에서 추가한 ListView 연결

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

         

        // ListView에 어댑터 연결

        m_ListView.setAdapter(m_Adapter);

         

        // ListView에 아이템 추가

        m_Adapter.add("Test");

    }



위 코드가 일반적인 Adapter 를 통해 List를 구현할 때 소개되는 코드이다.

대개 이해가 다 잘 되는데 ArrayAdapter 관련해서 android.R.layout.simple_list_item_1 는 무엇이란 말인가.


developer.android.com을 보아도 아래와 같이만 나와 있다.

public static final int simple_list_item_1


Added in API level 1

Constant Value: 17367043 (0x01090003) 



구글링을 좀 더 해보니 android가 기본적으로 제공하는 Layout.

즉, list 를 표시하는 layout 중에 하나인데, 리스트 한 줄에 텍스트 한줄을 표시하라는 의미이다.


결과물은 리스트가 잘나오긴 하나, 배경화면 흰색에 글씨 흰색.

List를 누를때만 잠시 Text가 보인다.


simple_list_item_1 layout내 TextView가 기본이 흰색인가 보다.

Adapter내 getView API를 override하여 TextColor를 Black으로 수정해 보았다.


        m_Adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1) {

            @Override

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

                View view = super.getView(position, convertView, parent);

                TextView tv = (TextView) view.findViewById(android.R.id.text1);

                tv.setTextColor(Color.BLACK);

                return view;

            }

        };



List가 검은색 글씨로 잘 나온다.


이번엔 버튼을 구르면 리스트가 자동으로 추가되는 부분이다.

Android Studio에서 Navigation Drawer Activity를 사용



        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);

        fab.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

             m_Adapter.add("TEST");

             m_Adapter.notifyDataSetChanged();

                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)

                        .setAction("Action", null).show();

            }

        });



[최종 Activity 구현 내용]



public class MainActivity extends AppCompatActivity

        implements NavigationView.OnNavigationItemSelectedListener {

    private ListView m_ListView;

    private ArrayAdapter<String> m_Adapter;


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        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) {

                m_Adapter.add("TEST");

                m_Adapter.notifyDataSetChanged();

                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)

                        .setAction("Action", null).show();

            }

        });


        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);

        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(

                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);

        drawer.setDrawerListener(toggle);

        toggle.syncState();


        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);

        navigationView.setNavigationItemSelectedListener(this);


        // My implementation.

        m_Adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1) {

            @Override

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

                View view = super.getView(position, convertView, parent);

                TextView tv = (TextView) view.findViewById(android.R.id.text1);

                tv.setTextColor(Color.BLACK);

                return view;

            }

        };

        m_ListView = (ListView) findViewById(R.id.memolist);

        m_ListView.setAdapter(m_Adapter);


        m_Adapter.add("ABC");

        m_Adapter.add("ABCD");

        m_Adapter.add("ABCDE");

    }

}



728x90