ListView(2) - SimpleAdapter 소스 해석 및 ViewBinders 사용법
30005 단어 SimpleAdapter
안드로이드 원본이라고 하면 많은 사람들이 보면 머리가 점점 어지러워지고 결국은 흐지부지될 수도 있다.그러나 원본 코드를 이해하면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
////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 。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ListView(2) - SimpleAdapter 소스 해석 및 ViewBinders 사용법제목과 같이, 여기는 주로 Simple Adapter의 원본 코드를 설명하는데, ViewBinders는 단지 이 종류의 지식점일 뿐이다. 안드로이드 원본이라고 하면 많은 사람들이 보면 머리가 점점 어지러워지고 결국은...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.