看板 KnucklesNote
作者 標題 [AndroidStudio] 列表的Adapter使用不同的layout檔
時間 2017-01-11 Wed. 12:11:06
依這篇 [AndroidStudio] 自訂Adapter用JSON資料建立ListView - KnucklesNote板 - Disp BBS
使用 Adapter 建立了 ListView 後
如果要在列表頁的 ListView 上方或下方加上不同的 layout 時
可以用 ListView 的成員函式 addHeaderView() 或 addFooterView()
參考這篇 [AndroidStudio] 在ListView下方加上"載入更多"的按鈕
如果是要在列表中的某幾列使用不同的 layout 時,像這樣
![[圖]](http://i.imgur.com/61I2VBC.png)
假設固定只有兩個置頂文時
第0列和第3列的 layout 使用 row_headertitle.xml
其他列的 layout 使用 row_textlist.xml
新增 layout 檔 row_headertitle.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#555">
<TextView android:id="@+id/header_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:textColor="#CCC"
/>
</RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#555">
<TextView android:id="@+id/header_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:textColor="#CCC"
/>
</RelativeLayout>
修改 Adapter 的 java 檔
加上兩個成員函式
@Override
public int getItemViewType(int position) {
// 讓Adapter區分目前位置是用哪一個view,避免回收時用到錯誤的view
if(position==0 || position==3){
return 0;
}else{
return 1;
}
}
@Override
public int getViewTypeCount() {
return 2; // 有用到幾種view
}
public int getItemViewType(int position) {
// 讓Adapter區分目前位置是用哪一個view,避免回收時用到錯誤的view
if(position==0 || position==3){
return 0;
}else{
return 1;
}
}
@Override
public int getViewTypeCount() {
return 2; // 有用到幾種view
}
修改成員函式 getCount() 與 getItem()
@Override
public int getCount() {
return mJsonArray.length() + 4;
}
@Override
public Object getItem(int position) {
if(getItemViewType(position)==0){ //是headerTitle時不用取資料
return null;
}else if(position < 3){ //取出置頂文的資料
return mBotList.optJSONObject(position-1);
}else{ //取出最新文章的資料
return mJsonArray.optJSONObject(position-4);
}
}
public int getCount() {
return mJsonArray.length() + 4;
}
@Override
public Object getItem(int position) {
if(getItemViewType(position)==0){ //是headerTitle時不用取資料
return null;
}else if(position < 3){ //取出置頂文的資料
return mBotList.optJSONObject(position-1);
}else{ //取出最新文章的資料
return mJsonArray.optJSONObject(position-4);
}
}
修改成員函式 getView()
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//在前面加上這段,將第0列和第3列使用不同的 layout
if(getItemViewType(position)==0){
convertView = mInflater.inflate(R.layout.row_headertitle, parent, false);
TextView titleTextView = (TextView) convertView.findViewById(R.id.header_title);
if(position==0) {
titleTextView.setText("置頂文章");
}else{
titleTextView.setText("最新文章");
}
return convertView;
}
//... 其他列使用原本的 layout
public View getView(int position, View convertView, ViewGroup parent) {
//在前面加上這段,將第0列和第3列使用不同的 layout
if(getItemViewType(position)==0){
convertView = mInflater.inflate(R.layout.row_headertitle, parent, false);
TextView titleTextView = (TextView) convertView.findViewById(R.id.header_title);
if(position==0) {
titleTextView.setText("置頂文章");
}else{
titleTextView.setText("最新文章");
}
return convertView;
}
//... 其他列使用原本的 layout
修改 Activity 的 java 檔
修改成員函式 onItemClick()
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//前面加上這段,若是點擊了 headerTitle 時不用動作
if(parent.getAdapter().getItemViewType(position)==0){
return;
}
//...
//前面加上這段,若是點擊了 headerTitle 時不用動作
if(parent.getAdapter().getItemViewType(position)==0){
return;
}
//...
--
※ 作者: Knuckles 時間: 2017-01-11 12:11:06
※ 編輯: Knuckles 時間: 2017-02-25 03:32:06
※ 看板: KnucklesNote 文章推薦值: 0 目前人氣: 0 累積人氣: 204
回列表(←)
分享