我是否可以在布局文件中使用XML标记,该文件等同于ListView.addHeaderView()
?
答案 0 :(得分:18)
我写了一个简单的ListView
,就像你的要求一样。
在attrs.xml
文件夹中的value
声明自定义属性:
<resources>
<declare-styleable name="HeaderListViewFromXML">
<attr name="headerView" format="reference"/>
</declare-styleable>
</resources>
创建HeaderListViewFromXML
类扩展ListView
public class HeaderListViewFromXML extends ListView {
private int headerId;
public HeaderListViewFromXML(Context context) {
this(context, null);
}
public HeaderListViewFromXML(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public HeaderListViewFromXML(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.HeaderListViewFromXML, defStyle, defStyle);
try {
headerId = a.getResourceId(R.styleable.HeaderListViewFromXML_headerView, View.NO_ID);
if (headerId != View.NO_ID) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View header = inflater.inflate(headerId, null);
addHeaderView(header);
}
} finally {
a.recycle();
}
}
}
在HeaderListViewFromXML
layout.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.rewidget.HeaderListViewFromXML
android:id="@+id/listWithHeader"
android:layout_width="fill_parent"
android:layout_height="150dp"
android:layout_marginTop="60dp"
android:background="#00FF00"
// custom attribute. Point to layout in header1.xml
app:headerView="@layout/header1" />
</RelativeLayout>
在“活动”中,使用正常ListView
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView list = (ListView) findViewById(R.id.listWithHeader);
String[] values = new String[] { "Android", "iPhone", "WindowsMobile", "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2" };
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, values);
list.setAdapter(adapter);
}
}