2

アーティストのリストを作成しました。これをクリックすると、アルバムのリストが表示されます。アイデアは、アルバムをクリックすると、曲のリストが表示されるということです。

残念ながら、このアクティビティでは 2 つのリストビューが生成されているため、2 番目の「onItemClick」メソッドは Eclipse で「重複」としてフラグが立てられます。誰でもこれを修正する方法を知っていますか?

主なアクティビティ コードは次のとおりです。

package music.library;

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class MusicLibrary extends Activity implements OnItemClickListener {
  Cursor cursor;
  @SuppressWarnings("deprecation")
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    String[] columns = { 
            MediaStore.Audio.Artists._ID,
            MediaStore.Audio.Artists.ARTIST };

    cursor = managedQuery(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,
        columns, null, null, null);

    ListView listView = (ListView) findViewById(R.id.listView);
    listView.setOnItemClickListener(this);
    String[] displayFields = new String[] { MediaStore.Audio.Artists.ARTIST };
    int[] displayViews = new int[] { R.id.artistItem };
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
        R.layout.artist_item, cursor, displayFields, displayViews);
    listView.setAdapter(adapter);

  }


  @SuppressWarnings("deprecation")
public void onItemClick(AdapterView<?> a, View v, int position, long id) {
    if (cursor.moveToPosition(position)) {

      String[] columns = {
          MediaStore.Audio.Media._ID,
          MediaStore.Audio.Media.ALBUM,
     };

      String where = android.provider.MediaStore.Audio.Media.ARTIST
          + "=?";

      String whereVal[] = { cursor.getString(cursor
          .getColumnIndex(MediaStore.Audio.Albums.ARTIST)) };

      String orderBy = android.provider.MediaStore.Audio.Media._ID;

      cursor = managedQuery(
          MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, columns,
          where, whereVal, orderBy);

      ListView listView = (ListView) findViewById(R.id.listView);
      String[] displayFields = new String[] { MediaStore.Audio.Media.ALBUM };
      int[] displayViews = new int[] { R.id.albumItem };
      SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
          R.layout.album_item, cursor, displayFields, displayViews);
      listView.setAdapter(adapter);

    }
  }


  @SuppressWarnings("deprecation")
public void onItemClick(AdapterView<?> a, View v, int position, long id) {
        if (cursor.moveToPosition(position)) {

            String[] columns = { 
                MediaStore.Audio.Media._ID,
                MediaStore.Audio.Media.DISPLAY_NAME,
            };

            String where = MediaStore.Audio.Media.ALBUM
                + "=?";

            String whereVal[] = { cursor.getString(cursor
                .getColumnIndex(MediaStore.Audio.Albums.ALBUM)) };

            String orderBy = MediaStore.Audio.Media._ID;

            cursor = managedQuery(
                MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, columns,
                where, whereVal, orderBy);

            ListView listView = (ListView) findViewById(R.id.listView);
            String[] displayFields = 
                    new String[] { MediaStore.Audio.Media.DISPLAY_NAME };
            int[] displayViews = new int[] { R.id.songItem };
            SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
                    R.layout.song_item, cursor, displayFields, displayViews);
                listView.setAdapter(adapter);

    }
  }

}

ご協力いただきありがとうございます。

- - 編集 - -

答えてくれてありがとう。すべての回答は素晴らしいものでしたが、意見をさまざまな活動に分けることが最も理にかなっているように見えるため、私はdymmehの回答を「受け入れられた」回答として選択しました(これが私が探していたと述べたものではない場合でも最初の質問)。

私は最終的に以下を作成しました:

アーティストを表示するファーストクラス:

package music.library;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class MusicLibrary extends Activity implements OnItemClickListener {
  Cursor cursor;
  @SuppressWarnings("deprecation")
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    String[] columns = { 
            MediaStore.Audio.Artists._ID,
            MediaStore.Audio.Artists.ARTIST 
            };

    cursor = managedQuery(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,
        columns, null, null, null);

    ListView listView = (ListView) findViewById(R.id.listView);
    listView.setOnItemClickListener(this);
    String[] displayFields = new String[] { MediaStore.Audio.Artists.ARTIST };
    int[] displayViews = new int[] { R.id.artistItem };
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
        R.layout.artist_item, cursor, displayFields, displayViews);
    listView.setAdapter(adapter); }

    public void onItemClick(AdapterView<?> a, View v, int position, long id) {
        if (cursor.moveToPosition(position)) {

            String where = android.provider.MediaStore.Audio.Media.ARTIST
          + "=?";

            String whereVal[] = { cursor.getString(cursor
          .getColumnIndex(MediaStore.Audio.Albums.ARTIST)) };

    Intent intent = new Intent(MusicLibrary.this, AlbumSelection.class);
    intent.putExtra("where", where);
    intent.putExtra("whereVal", whereVal);
    startActivity(intent);

        }
     }
  } 

2 番目のクラス、アルバムを表示:

package music.library;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class AlbumSelection extends Activity implements OnItemClickListener {
  Cursor cursor;
  @SuppressWarnings("deprecation")
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Bundle extras = getIntent().getExtras();
    String where = extras.getString("where");
    String[] whereVal = extras.getStringArray("whereVal");

    String[] columns = {
            MediaStore.Audio.Media._ID,
            MediaStore.Audio.Media.ALBUM,
       };

        String orderBy = android.provider.MediaStore.Audio.Media._ID;

    cursor = managedQuery(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
        columns, where, whereVal, orderBy);

    ListView listView = (ListView) findViewById(R.id.listView);
    listView.setOnItemClickListener(this);
    String[] displayFields = new String[] { MediaStore.Audio.Media.ALBUM };
    int[] displayViews = new int[] { R.id.albumItem };
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
        R.layout.album_item, cursor, displayFields, displayViews);
    listView.setAdapter(adapter); }

  public void onItemClick(AdapterView<?> a, View v, int position, long id) {
      if (cursor.moveToPosition(position)) {

        String where = android.provider.MediaStore.Audio.Media.ALBUM
        + "=?";

        String whereVal[] = { cursor.getString(cursor
        .getColumnIndex(MediaStore.Audio.Albums.ALBUM)) };

  Intent intent = new Intent(AlbumSelection.this, SongSelection.class);
  intent.putExtra("where", where);
  intent.putExtra("whereVal", whereVal);
  startActivity(intent);

       }    
    }
  } 

3 番目のクラス、曲を表示:

package music.library;

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class SongSelection extends Activity implements OnItemClickListener {
    Cursor cursor;
      @SuppressWarnings("deprecation")
      @Override
      public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Bundle extras = getIntent().getExtras();
        String where = extras.getString("where");
        String[] whereVal = extras.getStringArray("whereVal");

        String[] columns = {
                MediaStore.Audio.Media.DATA,
                MediaStore.Audio.Media._ID,
                MediaStore.Audio.Media.TITLE,
                MediaStore.Audio.Media.DISPLAY_NAME,
                MediaStore.Audio.Media.MIME_TYPE,
           };

            String orderBy = android.provider.MediaStore.Audio.Media.TITLE;

        cursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
            columns, where, whereVal, orderBy);

        ListView listView = (ListView) findViewById(R.id.listView);
        listView.setOnItemClickListener(this);
        String[] displayFields = new String[] { MediaStore.Audio.Media.TITLE };
        int[] displayViews = new int[] { R.id.songItem };
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
            R.layout.song_item, cursor, displayFields, displayViews);
        listView.setAdapter(adapter); }

        public void onItemClick(AdapterView<?> a, View v, int position, long id) {
            if (cursor.moveToPosition(position)) {

        /*Intent intent = new Intent(AlbumSelection.this, SongSelection.class);
        intent.putExtra("ARTIST", artist);
        startActivity(intent);
*/
           }    
        }
      } 

そして、それはすべてうまく機能しています。

すべての応答に感謝します。このコードを整理/効率化する方法について、フィードバックをお待ちしております。

再度、感謝します。

4

4 に答える 4

5

この解決策を見つけました。View.getId()値 -1 を返します。そのため、アイテムがクリックされたかどうかはわかりません。adapter.getId()代わりに使用してください。正しいアイテムの ID が返されます。

 @Override
 public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
     if (adapter.getId() == R.id.ls_menu_genre) {
         //item was clicked
     }
 }
于 2014-02-01T11:23:39.333 に答える
4

次の方法を使用する必要があります。

public void onItemClick(AdapterView<?> a, View v, int position, long id) {

一度だけ。次に、次のようなことができます。

v.getId()

次のようにします。

@SuppressWarnings("deprecation")
public void onItemClick(AdapterView<?> a, View v, int position, long id) {

        if( v.getId() == R.id.listView ){
            if (cursor.moveToPosition(position)) {

                String[] columns = { 
                    MediaStore.Audio.Media._ID,
                    MediaStore.Audio.Media.DISPLAY_NAME,
                };

                String where = MediaStore.Audio.Media.ALBUM
                    + "=?";

                String whereVal[] = { cursor.getString(cursor
                    .getColumnIndex(MediaStore.Audio.Albums.ALBUM)) };

                String orderBy = MediaStore.Audio.Media._ID;

                cursor = managedQuery(
                    MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, columns,
                    where, whereVal, orderBy);

                ListView listView = (ListView) findViewById(R.id.listView);
                String[] displayFields = 
                        new String[] { MediaStore.Audio.Media.DISPLAY_NAME };
                int[] displayViews = new int[] { R.id.songItem };
                SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
                        R.layout.song_item, cursor, displayFields, displayViews);
            }
                    listView.setAdapter(adapter);
        }else{
            if (cursor.moveToPosition(position)) {

              String[] columns = {
                  MediaStore.Audio.Media._ID,
                  MediaStore.Audio.Media.ALBUM,
             };

              String where = android.provider.MediaStore.Audio.Media.ARTIST
                  + "=?";

              String whereVal[] = { cursor.getString(cursor
                  .getColumnIndex(MediaStore.Audio.Albums.ARTIST)) };

              String orderBy = android.provider.MediaStore.Audio.Media._ID;

              cursor = managedQuery(
                  MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, columns,
                  where, whereVal, orderBy);

              ListView listView = (ListView) findViewById(R.id.listView);
              String[] displayFields = new String[] { MediaStore.Audio.Media.ALBUM };
              int[] displayViews = new int[] { R.id.albumItem };
              SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
                  R.layout.album_item, cursor, displayFields, displayViews);
              listView.setAdapter(adapter);

            }

        }


}
于 2012-05-03T14:04:32.863 に答える
2

これを行うには2つの方法があります

1.) 2 番目の onItemClick メソッドの内容を最初の内容に移動します。アーティストまたはアルバムのリストビューにいるかどうかを判断するフラグを設定し、それに基づいて onItemClick メソッドで機能を実行します。

if (artistMode)
{
   //do artist mode stuff for clicks
}
else
{
  //do album mode stuff for clicks
}

2.) より「標準的な」方法で行い、アルバム ビューとアーティスト ビューを別々のアクティビティに分割します。この方法では、通常は 2 つのアクティビティで行われるような 2 つのコード セットを 1 つのファイルで管理する必要がありません。

于 2012-05-03T14:04:35.907 に答える
0

onItemClick を 1 つだけ使用して、取得した AdapterView を確認し、それifに基づいてそこに を設定して、両方のリストを処理します。ただし、異なるアダプター名が必要です。これを実行しようとすると、両方を「アダプター」と呼ぶことはできません。

編集

同じリストビューを再利用していたことを見逃していました。新しいタック。変数を設定し、それを使用して微分します。

MusicLibrary に次を追加します。

private String currentList = "Artist";  // set the tracking variable to your initial list

これで、onClick は次のようになります。

public void onItemClick(AdapterView<?> a, View v, int position, long id) {
    if (currentList.equals("Artist")) {
        if (cursor.moveToPosition(position)) {
            String[] columns = {
            MediaStore.Audio.Media._ID,
            MediaStore.Audio.Media.ALBUM,
        };
        String where = android.provider.MediaStore.Audio.Media.ARTIST + "=?";
        String whereVal[] = { cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ARTIST)) };
        String orderBy = android.provider.MediaStore.Audio.Media._ID;

        cursor = managedQuery(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, columns, where, whereVal, orderBy);

        ListView listView = (ListView) findViewById(R.id.listView);
        String[] displayFields = new String[] { MediaStore.Audio.Media.ALBUM };
        int[] displayViews = new int[] { R.id.albumItem };
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
        R.layout.album_item, cursor, displayFields, displayViews);
        listView.setAdapter(adapter);
        currentList = "Album";  // re-set the list variable
    } else if (currentList.equals("Album")) {
        if (cursor.moveToPosition(position)) {
            String[] columns = { 
            MediaStore.Audio.Media._ID,
            MediaStore.Audio.Media.DISPLAY_NAME,
        };
        String where = MediaStore.Audio.Media.ALBUM + "=?";
        String whereVal[] = { cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM)) };
        String orderBy = MediaStore.Audio.Media._ID;

        cursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, columns, where, whereVal, orderBy);

        ListView listView = (ListView) findViewById(R.id.listView);
        String[] displayFields = 
        new String[] { MediaStore.Audio.Media.DISPLAY_NAME };
        int[] displayViews = new int[] { R.id.songItem };
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
        R.layout.song_item, cursor, displayFields, displayViews);
        listView.setAdapter(adapter);
        currentList = "Songs";  // re-set the list variable
        }
    }
}
于 2012-05-03T14:08:52.320 に答える