簡體   English   中英

Android:使用XML布局列表單元格而不是Java代碼布局(小部件)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM