안드로이드 개발 질문/답변
(글 수 45,052)
spinner가 선택되어 있는 list를 다시 선택 하면 Listener가 먹히질 않네요..
선택되어있는 값을 다시 선택해도 Listener 가 먹히게 할수 없나요? ㅠㅠ
2012.12.06 17:26:16
기본 컴포넌트가 마음에 안들면 이런거라도.....
package com.kotto.gsUi;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.TextView;
import android.widget.Toast;
public abstract class gsBtnSpinner
{
int ITME_HEIGHT = 80 ;
/// 인스턴스(필요하니까 -_-)
Activity m_ac ;
int m_selectedPos = 0 ;
/// UI
Button m_btn ; /// 레이아웃에 넣은 실제 표시되는 버튼
/// 팝업
gsDialog m_dialog ; /// 버튼 누르면 팝업되는 팝업창
LinearLayout m_groupPopView ; /// 팝업창에 씌워지는 레이아웃
ListView m_popupListView ; /// 팝업창에 보여질 리스트뷰
/// 리스트뷰에 사용되는 것들
ArrayList< String > m_listViewItem = null ; /// 목록으로 보여질 내용 리스트 역시 커스텀하면 버려지겠지
listViewAdt m_adt ; /// 리스트뷰에 사용될 아답터
ArrayList< TextView > m_listView_textviews ;/// 리스트뷰 목록에 들어가는 텍스트뷰들
ArrayList< RadioButton > m_listView_radios ; /// 리스트뷰 목록에 들어가는 라디오버튼들
/// 커스텀 된 경우에 사용 할 녀석
ListAdapter m_cuotomAdt = null ;
/// 생성자
public gsBtnSpinner( Activity ac, int rcId )
{
/// 인스턴스 저장하고 ID값을 참조해서 Button얻어두기
m_ac = ac ;
m_btn = (Button)ac.findViewById( rcId ) ;
/// Button이 눌려지면 Spinner처럼 목록창이 팝업되는 흉내를 내려고 한다.
m_btn.setOnClickListener( new OnClickListener( )
{
@Override
public void onClick(View v)
{
/// 만약 리스트뷰에 띄울 내용인 m_listViewItem가 빈상태로 팝업이 띄워지게 되면 m_adt도 null이다.
/// 커스텀된 Adapter도 없으면 에러가 나니까 예외처리한다.
// if( m_adt == null && m_cuotomAdt == null )
// {
// gsPopup.okPopup( m_ac, "listView에 들어갈 아이템이나 Adapter가 셋팅되지 않았습니다.", "닫기", null ) ;
// }
// else
{
/// 화면에 목록이 나오는 창을 띄운다.
viewSpinnerPopup( ) ;
}
}
} ) ;
}
public void setSelectPos( int pos )
{
m_selectedPos = pos ;
}
public gsBtnSpinner( Activity ac, Button btn )
{
/// 인스턴스 저장하고 ID값을 참조해서 Button얻어두기
m_ac = ac ;
m_btn = btn ;
/// Button이 눌려지면 Spinner처럼 목록창이 팝업되는 흉내를 내려고 한다.
m_btn.setOnClickListener( new OnClickListener( )
{
@Override
public void onClick(View v)
{
/// 만약 리스트뷰에 띄울 내용인 m_listViewItem가 빈상태로 팝업이 띄워지게 되면 m_adt도 null이다.
/// 커스텀된 Adapter도 없으면 에러가 나니까 예외처리한다.
// if( m_adt == null && m_cuotomAdt == null )
// {
// gsPopup.okPopup( m_ac, "listView에 들어갈 아이템이나 Adapter가 셋팅되지 않았습니다.", "닫기", null ) ;
// }
// else
{
/// 화면에 목록이 나오는 창을 띄운다.
viewSpinnerPopup( ) ;
}
}
} ) ;
}
/////////////////////
///// 목록을 셋팅해서 단순 텍스트 리스트형으로 쓰는게 대부분이겠지만
///// 역시나 커스텀 해서 쓰는 경우는 생기기 마련이라서...
/////////////////////
/// 목록 아이템을 셋팅하는 함수
public void setItem( ArrayList< String > items )
{
m_listViewItem = items ;
}
/// Coutom Adapter을 사용 할 경우 요 함수를 사용하면 되겠다.
public void setAdt( ListAdapter adt )
{
m_cuotomAdt = adt ;
}
/// 버튼을 눌렀을때 Spinner처럼 팝업창을 띄우는데 사용하는 함수다.
void viewSpinnerPopup( )
{
/// 팝업창 관련 생성
m_groupPopView = new LinearLayout( m_ac ) ; /// 팝업에 넣을 뷰 생성
//m_groupPopView.setBackgroundColor( 0xffff0000 ) ;
m_popupListView = new ListView( m_ac ) ; /// 리스트뷰 생성
//m_popupListView.setLayoutParams( new LinearLayout.LayoutParams( 500, 500 ) ) ;
int width = m_ac.getWindow( ).getWindowManager( ).getDefaultDisplay( ).getWidth( ) ;
int height = m_ac.getWindow( ).getWindowManager( ).getDefaultDisplay( ).getHeight( ) ;
int w = (int) (width - width * 0.2f ) ;
int h = (int) (height - height * 0.2f ) ;
//if( ITME_HEIGHT * )
m_popupListView.setBackgroundColor( 0x00000000 ) ;
m_groupPopView.addView( m_popupListView, /// 리스트를 레이아웃에 넣음
new LinearLayout.LayoutParams( w, h ) ) ;
/// 커스텀 아답터가 없을 경우에만 기본 아답터를 사용한다.
if( m_cuotomAdt == null )
{
if( m_listViewItem != null )
{
/// 리스트뷰 목록에 들어가는 텍스트뷰들
//m_listView_radios = new ArrayList< RadioButton >( ) ;
m_listView_textviews = new ArrayList< TextView >( ) ;
m_adt = new listViewAdt( m_ac, 0, m_listViewItem ) ;
m_popupListView.setAdapter( m_adt ) ;
m_adt.notifyDataSetInvalidated( ) ;
}
else
{
//gsPopup.okPopup( m_ac, "listView에 들어갈 아이템이나 Adapter가 셋팅되지 않았습니다.", "닫기", null ) ;
Toast.makeText( m_ac, "listView에 들어갈 아이템이나 Adapter가 셋팅되지 않았습니다.", Toast.LENGTH_SHORT ).show( ) ;
return ;
}
}
else
{
m_popupListView.setAdapter( m_cuotomAdt ) ;
}
m_popupListView.setOnItemClickListener( new OnItemClickListener( )
{
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
{
m_selectedPos = arg2 ;
onItemClicked( arg0, arg1, arg2, arg3 ) ;
m_dialog.dismiss( ) ;
}
} ) ;
//resetRadio( ) ;
m_popupListView.setSelection( m_selectedPos ) ;
m_dialog = new gsDialog( m_ac ) ;
m_dialog.requestWindowFeature( Window.FEATURE_NO_TITLE ) ;
m_dialog.getWindow().setBackgroundDrawable( new ColorDrawable( Color.TRANSPARENT ) ) ;
//m_dialog.
m_dialog.addContentView( m_groupPopView,
new RelativeLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT ) ) ;
m_dialog.show( ) ;
}
void resetRadio( )
{
// if( m_listViewItem != null )
// {
// for( int i = 0 ; i < m_listViewItem.size( ) ; i++ )
// {
// //m_listView_radios.get( i ).setChecked( false ) ;
// m_listView_textviews.get( i ).setBackgroundColor( 0xff000000 ) ;
// }
// if( m_selectedPos < m_listViewItem.size( ) )
// {
// //m_listView_radios.get( m_selectedPos ).setChecked( false ) ;
// m_listView_textviews.get( m_selectedPos ).setBackgroundColor( 0xffcccccc ) ;
// }
// }
}
/// Popup되는 Dialog의 속성인데 백버튼을 눌렀을때 notSelect를 흉내내기 위해서 하나 넣어준 것 이외에는
/// 아무짓도 하지 않은 상태이다.
class gsDialog extends Dialog
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
//showDialog(PROGRESS_DIALOG);
super.onCreate(savedInstanceState);
}
public gsDialog(Context context)
{
super(context);
// TODO Auto-generated constructor stub
}
public gsDialog( Context context, int themeTranslucentNotitlebar)
{
super(context);
}
@Override
public void onBackPressed()
{
onItemNotSelected( m_selectedPos ) ;
super.onBackPressed();
}
}
/// 기본적인 팝업 리스트 아답터
/// 간단히 리스트에 들어있는 텍스트를 나열하는 것 밖에 안한다.
/// 커스텀 쓰고싶으면 커스텀으로 받고 이건 안쓰겠지....
class listViewAdt extends ArrayAdapter< String >
{
/// 사용할 TextView와 Radio의 아이디로 사용할 더미값
static final int textViewId = 12356 ;
static final int radioViewId = 45689 ;
List< String > obj ;
/// 일단 의미없는 생성자
public listViewAdt(Context context, int textViewResourceId,
List< String > objects) {
super(context, textViewResourceId, objects);
obj = objects ;
// TODO Auto-generated constructor stub
}
/// 뷰처리
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View sv = null ; /// 보여질 View
TextView tv ; /// 문자열이 들어갈 TextView
RadioButton radio ;
if( convertView == null )
{
/// Layout 하나 생성
LinearLayout lLayout = new LinearLayout( m_ac ) ;
sv = lLayout ; /// 리턴할 View에다가 인스턴스 넣어줌
lLayout.setOrientation( LinearLayout.HORIZONTAL ) ; /// 레이아웃은 가로정렬
lLayout.setLayoutParams( new AbsListView.LayoutParams( LayoutParams.FILL_PARENT, ITME_HEIGHT ) ) ;
lLayout.setGravity( Gravity.CENTER_VERTICAL | Gravity.LEFT ) ;
// /// 선택 표시를 위한 RadioButton
// radio = new RadioButton( m_ac ) ;
// radio.setId( radioViewId ) ;
// lLayout.addView( radio, /// Layout에다가 TextView를 자식으로 추가
// new LinearLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT ) ) ;
// m_listView_radios.add( radio ) ;
// radio.setEnabled( false ) ;
/// 텍스트표시를 위한 TextView
tv = new TextView( m_ac ) ; /// 문자열을 띄울 TextView 생성
tv.setId( textViewId ) ; /// TextView 구별용 ID값을 넣어준다.
lLayout.addView( tv, /// Layout에다가 TextView를 자식으로 추가
new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT ) ) ;
tv.setTextColor( 0xff000000 ) ;
tv.setGravity( Gravity.CENTER_VERTICAL | Gravity.LEFT ) ;
tv.setPadding( 15, 5, 0, 5 ) ;
m_listView_textviews.add( tv ) ;
}
else
{
/// 생성하는 경우가 아니면 기존걸 재사용
sv = (View)convertView ;
tv = (TextView)sv.findViewById( textViewId ) ; /// TextView는 ID값을 가지고 얻어둬야 쓰니까...
}
if( position == m_selectedPos )
{
sv.setBackgroundColor( 0xffcccccc ) ;
}
else
{
sv.setBackgroundColor( 0xffffffff ) ;
}
/// TextView의 내용을 ArrayList에서 꺼내서 표시해준다.
tv.setText( m_listViewItem.get( position ) ) ;
return sv ;
}
}
abstract public void onItemClicked( AdapterView<?> arg0, View arg1, int arg2, long arg3 ) ;
abstract public void onItemNotSelected( int selectedPos ) ;
}



