这个组件与Mark Murphy 的书《The Busy Coder’s Guide to Advanced Android Development》有一些不同,这个SectionedAdapter是通过干坏事,反编译Vending.apk得到的。还有一个是AggregatedAdapter,合起来实现market单个软件信息显示的效果。
不过AggregatedAdapter比较难反编译出来,没关系,加上cwac-merge这个组件,就可以实现同样的效果。不同分段的Adapter,继承SectionedAdapter,实现自己的东西,该干啥就干啥,然后merge起来。
SectionAdapter.java
/*
* Copyright (C) 2010 lytsing.org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.lytsing.adapters;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
/**
* abstract SectionAdapter, difference from
* cw-advandroid/ListView/Sections/src/com/commonsware/android/listview/SectionedAdapter.java
* just decompile from Vending.apk :-)
*
*/
abstract public class SectionAdapter extends BaseAdapter {
protected int mCount;
protected boolean mDeactivated;
protected View mSectionHeaderView;
/**
* Constructor
*
* @param sectionTitleId The resource ID for a layout file containing a layout to use when
* instantiating views.
* @param context The current context.
* @param parent The parent that this view will eventually be attached to
*/
public SectionAdapter(int sectionTitleId, Context context, ViewGroup parent) {
this(Util.inflateView(R.layout.section_header, context, parent));
((TextView)mSectionHeaderView).setText(sectionTitleId);
}
/**
* Constructor
*
* @param sectionHeaderView The header view
*/
public SectionAdapter(View sectionHeaderView) {
mSectionHeaderView = sectionHeaderView;
mDeactivated = false;
mCount = 0;
}
public void activate() {
if (mDeactivated) {
mDeactivated = false;
notifyDataSetChanged();
}
}
/**
* Are all items in this SectionAdapter enable?
* If yes it means all items are selectable and clickable.
*/
public boolean areAllItemsEnabled() {
return false;
}
public void deactivate() {
if (mDeactivated == false) {
mDeactivated = true;
notifyDataSetChanged();
}
}
/**
* How many items are in the data set represented by this
* Adapter.
*/
public int getCount() {
if (mDeactivated) {
return 0;
} else {
return mCount + 1; // add one for header
}
}
/**
* Get the data item associated with the specified
* position in the data set.
*
* @param position Position of the item whose data we want
*/
public Object getItem(int position) {
if (position == 0) {
return mSectionHeaderView;
}
return null;
}
/**
* Get the row id associated with the specified position
* in the list.
*
* @param position Position of the item whose data we want
*/
public long getItemId(int position) {
if (position == 0) {
return mSectionHeaderView.getId();
}
return 0;
}
/**
* Get a View that displays the data at the specified
* position in the data set.
*
* @param position Position of the item whose data we want
* @param convertView View to recycle, if not null
* @param parent ViewGroup containing the returned View
*/
public View getView(int position, View convertView, ViewGroup parent) {
return position == 0 ? mSectionHeaderView : null;
}
/**
* Returns true if the item at the specified position is not a separator
* (A separator is a non-selectable, non-clickable item).
*
* @param position Index of the item
* @return True if the item is not a separator
*/
public boolean isEnabled(int position) {
return false;
}
}
Util.java
/*
* Copyright (C) 2010 lytsing.org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.lytsing.adapters;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* Util
*
*/
public class Util {
private Util() {
}
/**
* Inflate a new view hierarchy from the specified XML resource.
*
* @param resource ID for an XML layout resource to load
* @param context The current context.
* @return The root View of the inflated XML file.
*/
public static View inflateView(int resource, Context context) {
return inflateView(resource, context, null);
}
/**
* Inflate a new view hierarchy from the specified xml resource.
*
* @param resourceID for an XML layout resource to load (e.g.,
* @param context The current context.
* @param parent simply an object that provides a set of LayoutParams
* values for root of the returned hierarchy
* @return The root View of the inflated XML file.
*/
public static View inflateView(int resource, Context context, ViewGroup parent) {
LayoutInflater vi = (LayoutInflater)context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
return vi.inflate(resource, parent, false);
}
}
res/layout/section_header.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textStyle="bold"
android:gravity="center_vertical"
android:background="@android:drawable/dark_header"
android:paddingLeft="8.0dip"
android:layout_width="fill_parent"
android:layout_height="26.0dip"
>
</TextView>
代码下载; https://github.com/lytsing/SectionedAdapter
参考阅读:
Jeff Sharkey’s blog : Separating Lists with Headers in Android 0.9
androidguys: CWAC’d Up: Alternative Adapters
本博客文章: 千万不要把Listview放在ScrollView里