ListView(2) - SimpleAdapter 소스 해석 및 ViewBinders 사용법

30005 단어 SimpleAdapter
제목과 같이, 여기는 주로 Simple Adapter의 원본 코드를 설명하는데, ViewBinders는 단지 이 종류의 지식점일 뿐이다.
안드로이드 원본이라고 하면 많은 사람들이 보면 머리가 점점 어지러워지고 결국은 흐지부지될 수도 있다.그러나 원본 코드를 이해하면android의 운영을 더욱 깊이 이해하고 우수한 코드를 손쉽게 쓸 수 있다.사실android 원본을 보면 처음부터 반드시 중요하거나 핵심부터 시작하는 것은 아니다. 볼 수 있어도 힘들고 낭비하는 시간도 많다.소 한 마리를 해부하는 것과 같이 내가 하면 나는 먼저 바깥쪽의 고기를 한칼에 제거할 것이다. (나는 경험이 풍부한 사람이 아니기 때문에) 먼저 간단하게 한 층 한 층 벗기고 소고기는 천천히 제거하면 전체 뼈대를 볼 수 있다.이렇게 하면 인내심을 빨리 잃지 않을 뿐만 아니라 자신이 계속 공부하고 싶은 욕망을 불러일으킬 수 있다. 비록 이런 방법은 매우 느리지만 과정이 명백해지면 나중에 빨리 할 수 있다.물론 남은 뼈도 뜯기 쉽지 않지만:) 적어도 훨씬 가볍다.
여기서 설명한 예는 주로 다른 사람과 결합하여 말하고 인용한 문장 링크: http://mgmblog.com/2008/12/29/simpleadapter-viewbinders/
        SimpleAdapter toolsAdapter =

               new SimpleAdapter(
                       this,
                       _activityNames,
                       R.layout.row,
                       new String[] { ACTIVITY_NAME_ENTRY },
                       new int[] { R.id.text1 } );
이 코드는 SimpleAdapter를 생성하는 코드입니다. 변수를 무시하십시오.이 코드를 실행하면 다음과 같은 작업이 수행됩니다.
  

  
public SimpleAdapter(Context context, List <? extends Map < String, ?>> data,
int resource, String[] from, int [] to) {
mData
= data;
mResource
= mDropDownResource = resource;
mFrom
= from;
mTo
= to;
mInflater
= (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

SimpleAdapter 아래의 원본 코드는 계승해서 BaseAdapter를 다시 쓰는 방법과 차이가 많지 않습니다.

  
/* *
* @see android.widget.Adapter#getCount()
*/
public int getCount() {
return mData.size();
}

/* *
* @see android.widget.Adapter#getItem(int)
*/
public Object getItem( int position) {
return mData. get (position);
}

/* *
* @see android.widget.Adapter#getItemId(int)
*/
public long getItemId( int position) {
return position;
}

/* *
* @see android.widget.Adapter#getView(int, View, ViewGroup)
*/
public View getView( int position, View convertView, ViewGroup parent) {
return createViewFromResource(position, convertView, parent, mResource);
}
// listview
private View createViewFromResource( int position, View convertView,
ViewGroup parent,
int resource) {
View v;
if (convertView == null ) {
v
= mInflater.inflate(resource, parent, false );
}
else {
v
= convertView;
}

bindView(position, v);

return v;
}

//bindView가 중점입니다. 주로 item에 전송된 xml 파일을 분석한 다음에 Checkable인지 TextView 또는ImageView인지 판단하고 해당하는 처리를 합니다.

  
private void bindView( int position, View view) {
final Map dataSet
= mData. get (position);
if (dataSet == null ) {
return ;
}

final ViewBinder binder
= mViewBinder;
final String[] from
= mFrom;
final
int [] to = mTo;
final
int count = to.length;

for ( int i = 0 ; i < count; i ++ ) {
final View v
= view.findViewById(to[i]);
if (v != null ) {
final Object data
= dataSet. get (from[i]);
String text
= data == null ? "" : data.toString();
if (text == null ) {
text
= "" ;
}

boolean bound
= false ;
if (binder != null ) {
bound
= binder.setViewValue(v, data, text);
}

if ( ! bound) {
if (v instanceof Checkable) {
if (data instanceof Boolean) {
((Checkable) v).setChecked((Boolean) data);
}
else if (v instanceof TextView) {
// Note: keep the instanceof TextView check at the bottom of these
// ifs since a lot of views are TextViews (e.g. CheckBoxes).
setViewText((TextView) v, text);
}
else {
throw new IllegalStateException(v.getClass().getName() +
" should be bound to a Boolean, not a " +
(data
== null ? " <unknown type> " : data.getClass()));
}
}
else if (v instanceof TextView) {
// Note: keep the instanceof TextView check at the bottom of these
// ifs since a lot of views are TextViews (e.g. CheckBoxes).
setViewText((TextView) v, text);
}
else if (v instanceof ImageView) {
if (data instanceof Integer) {
setViewImage((ImageView) v, (Integer) data);
}
else {
setViewImage((ImageView) v, text);
}
}
else {
throw new IllegalStateException(v.getClass().getName() + " is not a " +
" view that can be bounds by this SimpleAdapter " );
}
}
}
}
}

이 코드는 주로 특수 데이터에 맞추어 처리한다
boolean bound = false;
if (binder != null) {
          bound = binder.setViewValue(v, data, text);
}
 
SimpleAdapter의 기본 해석은 여기까지입니다.
이제 그 문장과 결합하여 남은 점을 말해 보아라.
 
TextView를 다시 쓰면 터치 키가 다른 intent로 이동합니다
 

  
/// //ToolNameView.java
public class ToolNameView extends TextView
{
private Intent _intentToLaunch;

public ToolNameView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
setupView();
}

public ToolNameView(Context context, AttributeSet attrs)
{
super(context, attrs);
setupView();
}

public ToolNameView(Context context)
{
super(context);
setupView();
}

private void setupView()
{
this .setOnClickListener( new OnClickListener()
{
public void onClick(View v)
{
getContext().startActivity( _intentToLaunch );
}
});
}

public void setIntentToLaunch( Intent intent )
{
_intentToLaunch
= intent;
}

}

/// // layout/row.xml
<? xml version = " 1.0 " encoding = " utf-8 " ?>
< LinearLayout
xmlns:android
= " http://schemas.android.com/apk/res/android "
android:id
= " @+id/vw1 "
android:layout_width
= " fill_parent "
android:layout_height
= " wrap_content "
android:orientation
= " horizontal " >

< com.mgm.android.toolbox.ToolNameView
android:id
= " @+id/text1 "
android:textSize
= " 16sp "
android:textStyle
= " bold "
android:layout_width
= " fill_parent "
android:layout_height
= " wrap_content "
android:padding
= " 3dip " />

</ LinearLayout >

//////
class ToolboxRow
{
private Intent _intentToLaunch;
private String _name;

public ToolboxRow( Intent intentToLaunch, String name )
{
_intentToLaunch
= intentToLaunch;
_name
= name;
}

public Intent getIntentToLaunch()
{
return _intentToLaunch;
}

public String getName()
{
return _name;
}
}

ArrayList> _activityNames;
 
////name 및 intent를 데이터 소스에 추가activityNames
 

  
/* *

* DON'T FORGET TO ALSO ADD ACTIVITY TO MANIFEST!!

*

* @param name

* @param intentToLaunch

*/

private void addActivityToList( String name, Intent intentToLaunch )

{

HashMap entry
= new HashMap();

ToolboxRow row
= new ToolboxRow( intentToLaunch, name );

entry.put( ACTIVITY_NAME_ENTRY, row );



_activityNames.add( entry );

}

 
 
 
//////ToolBinder, ViewBinder의 메서드 setViewValue를 다시 쓰고 textview에 onclick 이벤트를 설정합니다.여기에는 BaseAapter를 다시 쓰는 방법과 차이가 많지 않습니다. 모두 같은 설정 이벤트입니다.
 

  
class ToolBinder implements ViewBinder
{

public boolean setViewValue(View view, Object data, String textRepresentation)
{
ToolNameView tool
= (ToolNameView)view;
ToolboxRow row
= (ToolboxRow)data;

tool.setIntentToLaunch( row.getIntentToLaunch() );
tool.setText( row.getName() );

return true ;
}
}


public class Toolbox extends ListActivity
{
private static final String ACTIVITY_NAME_ENTRY = " activity_name " ;

ArrayList
< HashMap < String, ToolboxRow >> _activityNames;

/* * Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);

setContentView(R.layout.main);

// define the list which holds the information of the list
_activityNames = new ArrayList < HashMap < String, ToolboxRow >> ();

addActivityToList(
" Data Roaming " , new Intent( this , DataRoamingSetting. class ) );
addActivityToList(
" Expanding Example " , new Intent( this , Expando. class ) );

SimpleAdapter toolsAdapter
=
new SimpleAdapter(
this ,
_activityNames,
R.layout.row,
new String[] { ACTIVITY_NAME_ENTRY },
new int [] { R.id.text1 } );

toolsAdapter.setViewBinder(
new ToolBinder() );
setListAdapter( toolsAdapter );
}
}
toolsAdapter.setViewBinder( new ToolBinder() );
   SimpleAdapter  setViewBinder  ,    

  if (binder != null) {
          bound = binder.setViewValue(v, data, text);
  }
      ,  true。       item      。

좋은 웹페이지 즐겨찾기