본문 바로가기

나의 플랫폼/안드로이드

[ Android ] ListView 모드 변환

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

ListView의 모드 변환을 시키는 소스를 만들어 보았다.

간단하게는 아래 사이트로 가면 setChoiceMode 함수만으로 간단하게 작성할 수 있다.

http://stackoverflow.com/questions/8502654/listview-toggle-choice-mode


하지만, 만약 List를 Custome한 Adapter로 사용하고 싶다면 아래 소스를 참조 하는것도 좋을 것이다.

MainActivity.java

package com.example.listmode;


import java.util.ArrayList;


import com.example.listmode.CustomListAdapter.ListItem;


import android.os.Bundle;

import android.app.ListActivity;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.AdapterView;

import android.widget.Button;

import android.widget.ListView;


public class MainActivity extends ListActivity 

                implements OnClickListener{

    private Button btnChange;

    private ArrayList<ListItem> mArrayList = new ArrayList<ListItem>();

    private CustomListAdapter mAdapter;


// List item을 선택 했을 경우 Item을 Check 한다.

// notifyDataSetChanged 함수를 호출하면 Adapter의 getView를 다시 부른다.

    private AdapterView.OnItemClickListener mItemClickListener = new

            AdapterView.OnItemClickListener() {

            @Override

            public void onItemClick(AdapterView<?> arg0, View view,

                    int position, long arg3) {

                mAdapter.setChecked(position);

                mAdapter.notifyDataSetChanged();

            }

    };


    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        initArrayList();

        mAdapter = new CustomListAdapter(this, mArrayList);

        mAdapter.setCurrentMode(ListView.CHOICE_MODE_NONE);

        setListAdapter(mAdapter);


        getListView().setOnItemClickListener(mItemClickListener);


        btnChange = (Button)findViewById(R.id.modeChange);

        btnChange.setOnClickListener(this);

    }

// List array 초기화

    private void initArrayList() {

         for (String str : GENRES) {

             ListItem item = new ListItem(false, str); 

             mArrayList.add(item);

         }

    }

// List Item의 Label 배열

    private static final String[] GENRES = new String[] {

        "Action", "Adventure", "Animation", "Children", "Comedy", "Documentary", "Drama",

        "Foreign", "History", "Independent", "Romance", "Sci-Fi", "Television", "Thriller"

    };

    // 버튼 클릭시 모드를 변환 시킨다.

    @Override

    public void onClick(View v) {

        if (mAdapter.getCurrentMode() == ListView.CHOICE_MODE_MULTIPLE) {

            mAdapter.setCurrentMode(ListView.CHOICE_MODE_NONE);

        } else {

            mAdapter.setCurrentMode(ListView.CHOICE_MODE_MULTIPLE);

        }

        setListAdapter(mAdapter);

    }

}


CustomListAdapter.java

package com.example.listmode;


import java.util.ArrayList;


import android.content.Context;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.CheckedTextView;

import android.widget.ListView;

import android.widget.TextView;


//Custom Adapter

class CustomListAdapter extends BaseAdapter {


    private int mCurrentMode;

    private LayoutInflater inflater;

    private Context mContext;

    private ArrayList<ListItem> sArrayList = new ArrayList<ListItem>();

    public CustomListAdapter (Context c , ArrayList<ListItem> mList){

        this.mContext = c;

        this.sArrayList = mList;


        inflater = LayoutInflater.from(c);

    }


    public void setAllChecked(boolean ischeked) {

        for(ListItem item : sArrayList){

            item.isChecked = ischeked;

        }

    }


    public void setChecked(int position) {

        final ListItem item = sArrayList.get(position);

        item.isChecked = !item.isChecked;

        sArrayList.set(position, item);

    }


    protected int getCurrentMode() {

        return mCurrentMode;

    }


    protected void setCurrentMode(int currentMode) {

        this.mCurrentMode = currentMode;

    }


    @Override

    public int getCount() { 

        return sArrayList.size();

    }


    @Override

    public Object getItem(int index) {

        return sArrayList.get(index);

    }


    @Override

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

        View v = convertView;

        TextView txt = null;


        final ListItem item = sArrayList.get(position);

        if (item == null) {

            return convertView;

        }


        if( v == null ){

            if (mCurrentMode == ListView.CHOICE_MODE_MULTIPLE) {

                v = inflater.inflate(android.R.layout.simple_list_item_checked, null);

                txt = (CheckedTextView)v.findViewById(android.R.id.text1);

            } else {

                v = inflater.inflate(android.R.layout.simple_list_item_1, null);

                txt = (TextView)v.findViewById(android.R.id.text1);

            }

        } else {

            txt = (TextView)v.findViewById(android.R.id.text1);

        }

        if (txt != null) {

            txt.setText(item.value);

            // CheckedTextView로 변환이 가능할 경우 setChecked를 해준다.

            if (txt instanceof CheckedTextView) {

                ((CheckedTextView)txt).setChecked(item.isChecked);

            }

        }


        return v;

    }

// List Item

    public static class ListItem {

        private boolean isChecked;

        private String value;

        public ListItem() {

            super();

        }

        public ListItem(boolean isChecked, String value) {

            super();

            this.isChecked = isChecked;

            this.value = value;

        }

    }


    @Override

    public long getItemId(int position) {

        // TODO Auto-generated method stub

        return sArrayList.get(position).hashCode();

    }


}


참고 사이트 : http://arabiannight.tistory.com/20