[英]Android: Use XML Layout for List Cell rather than Java Code Layout (Widgets)
我正在制作音樂應用程序,我目前正致力於圖書館功能。 但是,在使用列表視圖(特別是單元格)時,我遇到了一些問題。 我試圖從在java中創建的每個單元格中的簡單textview布局轉移到使用XML文件進行布局的布局(因此保持Java文件主要是語義)
這是我的單元格布局的原始代碼:
public View getView(int position, View convertView, ViewGroup parent) {
String id = null;
TextView tv = new TextView(mContext.getApplicationContext());
if (convertView == null) {
music_column_index = musiccursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE);
musiccursor.moveToPosition(position);
id = musiccursor.getString(music_column_index);
music_column_index = musiccursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME);
musiccursor.moveToPosition(position);
id += "\n" + musiccursor.getString(music_column_index);
music_column_index = musiccursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM);
musiccursor.moveToPosition(position);
id += "\n" + musiccursor.getString(music_column_index);
tv.setText(id);
} else
tv = (TextView) convertView;
return tv;
}
而我的新版本:
public View getView(int position, View convertView, ViewGroup parent) {
View cellLayout = findViewById(R.id.albums_list_cell);
ImageView album_art = (ImageView) findViewById(R.id.album_cover);
TextView album_title = (TextView) findViewById(R.id.album_title);
TextView artist_title = (TextView) findViewById(R.id.artist_title);
if (convertView == null) {
music_column_index = musiccursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM);
musiccursor.moveToPosition(position);
album_title.setText(musiccursor.getString(music_column_index));
//music_column_index = musiccursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME);
//musiccursor.moveToPosition(position);
music_column_index = musiccursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE);
musiccursor.moveToPosition(position);
artist_title.setText(musiccursor.getString(music_column_index));
} else{
cellLayout = (TextView) convertView;
}
return cellLayout;
}
初始化(在創建文件中完成):
musiclist = (ListView) findViewById(R.id.PhoneMusicList);
musiclist.setAdapter(new MusicAdapter(this));
musiclist.setOnItemClickListener(musicgridlistener);
以及相應的XML文件:
(主要)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView
android:id="@+id/PhoneMusicList"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
<TextView
android:id="@android:id/empty"
android:layout_width="wrap_content"
android:layout_height="0dip"
android:layout_weight="1.0"
android:text="@string/no_list_data"
/>
</LinearLayout>
(albums_list_cell)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/albums_list_cell"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/album_cover"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_width="50dip"
android:layout_height="50dip"
/>
<TextView
android:id="@+id/album_title"
android:layout_toRightOf="@+id/album_cover"
android:layout_alignParentTop="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/artist_title"
android:layout_toRightOf="@+id/album_cover"
android:layout_below="@+id/album_title"
android:layout_width="wrap_content"
android:layout_height="15dip"
/>
</RelativeLayout>
從理論上講(基於我到目前為止所做的一點點Android),這應該可行......但事實並非如此。 Logcat在錯誤代碼的第96行給出了一個空指針異常,即album_title.setText行。 這可能是我的演員有問題,但谷歌告訴我這沒關系:D
感謝您的幫助,如果您需要更多信息,請告訴我們!
編輯:只是要指出,本節所基於的代碼來自,現在大多數與我的相同
http://androidsamples.blogspot.com/2009/06/displaying-list-of-video-files-stored.html
如果要使用自定義布局來表示每個項目,則需要在適配器中使用LayoutInflater在getView方法中對自定義布局進行膨脹。
所以我會改變以下行:
View cellLayout = findViewById(R.id.albums_list_cell);
至:
View cellLayout = LayoutInflater.from(mContext).inflate(R.layout.albums_list_cell,null);
您需要將albums_list_cell.xml移動到布局文件夾中。
然后,您還將編輯如何檢索布局中定義的相關窗口小部件,如下所示:
ImageView album_art = (ImageView) cellLayout.findViewById(R.id.album_cover);
TextView album_title = (TextView) cellLayout.findViewById(R.id.album_title);
TextView artist_title = (TextView) cellLayout.findViewById(R.id.artist_title);
希望這可以幫助!
解決了上述問題...請注意以下行中的(TextView)強制轉換。 當然,這應該是一個相對布局
} else{
cellLayout = (TextView) convertView;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.