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
'나의 플랫폼 > 안드로이드' 카테고리의 다른 글
[ Android ] Custom NumberPicker (0) | 2013.09.25 |
---|---|
[ Android ] wheelpicker (0) | 2013.09.24 |
[ Android ] Preference 글자 색깔 (0) | 2013.09.03 |
[ Android ] PreferenceActivity와 Activity 상관 관계 (2) | 2013.08.26 |
[Android] Dialog 중복 방지 (4) | 2013.07.12 |