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);

        }
     }
  } 

第二课,展示专辑:

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);

       }    
    }
  } 

第三课,展示歌曲:

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

我看到了两种方法

1.) 将您的第二个 onItemClick 方法内容移动到第一个。有一个标志来确定您是否在艺术家或专辑列表视图中,并基于此在您的 onItemClick 方法中执行功能。

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

2.) 以更“标准”的方式进行操作,并将您的专辑和艺术家视图拆分为单独的活动。这样,您就不会在一个文件中管理通常在两个活动中完成的事情的两组代码。

于 2012-05-03T14:04:35.907 回答
0

仅使用一个 onItemClick,然后检查您获得的 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 回答