2012-05-03 2 views
2

나는 한 번 클릭하면 앨범 목록을 가져 오는 아티스트의 목록을 만들었습니다. 일단 앨범을 클릭하면 노래 목록이 나옵니다.하나의 활동에서 여러 onItemClick을 사용 중 ... "중복 메소드"오류가 발생했습니다.

불행히도이 활동에는 두 개의 목록 뷰가 생성되므로 두 번째 'onItemClick'메서드는 eclipse에서 'duplicate'로 플래그가 지정됩니다. 누구든지이 문제를 해결하는 방법을 알고 있습니까? 당신의 도움에 대한

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

     }  
    } 
    } 

세 번째 클래스 보여주는 노래 :

나는 다음을 만들어 결국

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); 
*/ 
      }  
     } 
     } 

그리고 그것은 다 잘 작동합니다.

모든 답변에 대해 감사합니다. 나는이 코드가 어떻게 정리되고/효율적으로 만들어 졌는지에 대한 의견을 듣고 싶다.

다시 한번 감사드립니다. 한 번만

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

:

+0

내 대답 업데이트, 잘하면 도움이 될 것입니다. – Barak

답변

4

당신은 방법을 사용한다. 당신은 다음과 같이 수행 할 수 있습니다

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

      } 

     } 


} 
+0

안녕하세요. 조언 해 주셔서 감사합니다. 내 특정 활동에서 이것을 어떻게 사용할 수 있는지 예를 들어 주시겠습니까? 자바 경험이 매우 제한되어 있습니다. 자바의 기본 사항을 읽는 동안이 작업을 해킹으로 처리하고 있습니다. 나는 실제로 순간에 인형에 대한 자바 프로그래밍을 읽고있다! 어쨌든 나는이 작업을 할 수 있기를 여전히 좋아하지만,이 상황에서 스위치를 어떻게 구현할 것인지 전혀 모른다. 시간 내 줘서 고마워. –

+0

안녕하세요 @ jsaye, 나는 이것을 시도했다. 그러나 항상 다른 사람에게가는 경우에는 가지 않을 것입니다. 이것은 id가 매번 v.getId()에서 -1을 반환했다는 것을 의미합니다. – Prasad

2

내가이

1을하는 두 가지 방법 참조) 처음으로 두 번째 onItemClick 방법의 내용을 이동 . 아티스트 또는 앨범 listview에 있는지 여부를 확인하고 해당 항목을 기반으로 onItemClick 메서드의 기능을 수행할지 여부를 결정하는 플래그가 있습니다.

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

2.) "표준"방식으로 더 많이하고 앨범과 아티스트보기를 별도의 활동으로 나눕니다. 이렇게하면 일반적으로 두 가지 작업에서 수행되는 작업을 위해 한 파일에 두 세트의 코드를 관리하지 않습니다.

+0

감사합니다. 나는 별도의 액티비티를 사용하는 것을 좋아하지만, 한 액티비티에서 다음 액티비티로 커서 위치를 옮기는 방법을 잘 모르겠다. 그렇게 할 수있는 방법에 대해 좀 더 알려주시겠습니까? 시간 내 줘서 고마워. –

+0

예! 아티스트가 ID를 알고 있다면 .. 예. long artistId = 2이면이 신분증을 두 번째 활동을 시작하려는 의도로 추가로 전달할 수 있습니다. 의도 i = 새로운 의도 (this, YourSecondActivity.class); i.putExtra ("ARTIST_ID", artistId); startActivity (i); – dymmeh

+0

두 번째 활동에서 onCreate 메서드의 값을 검색하려면 다음을 호출하면됩니다. long artistId = getIntent(). getLongExtra ("ARTIST_ID", -1); 데이터베이스 _Ids가 꽤 큰 값이 될 수 있기 때문에 우리는 Longs를 사용합니다. 값을 찾을 수 없으면 -1이 기본값입니다. – dymmeh

0

만 사용 하나 onItemClick은, 당신이있어 어댑터 뷰 AdapterView하는 확인하고 두 목록을 처리하기 위해 그 기반으로 거기에 if을 설정합니다.하지만 서로 다른 어댑터 이름이 필요합니다. 두 어댑터를 호출하면 "어댑터"가 작동하지 않을 것입니다.

편집

는 다시 사용했던 것과 같은 목록보기를 놓쳤다. 새로운 압정. 변수를 설정하고이를 사용하여 차별화하십시오. MusicLibrary에서

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

이 이제 온 클릭은 다음과 같이한다 :

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 
     } 
    } 
} 
+0

이 솔루션은 사용자에게 아티스트 또는 사용자 중 하나를 선택할 수있게 해주는 것으로 나에게는 보인다 (그리고 늦어서 지난 취침 시각이다. 앨범을 클릭 한 다음 하나 또는 다른보기를 클릭하면 그에 따라 변경됩니다. 이 특정 활동은 사용자가 아티스트를 선택하고 앨범을 선택해야하는 것이 바람직합니다. 나는 당신이 설명하려고하는 것을 완전히 이해하지 못했다고 생각합니다. if 문은 주어진 시간에 오직 하나의 목록 선택 만 가능하면 어떤 목록을 표시할지 결정할 수 있습니까? –

+0

역으로 생각하면 사용자를위한 선택의 여지가 없습니다. 이 목록은 클릭 처리기로 전송되는 항목을 정의합니다. 목록을 클릭하면 전달 된 매개 변수 중 하나가 AdapterView (즉, 목록 어댑터)입니다. 클릭하면 클릭 한 목록을 확인하고 적절하게 처리합니다. 아티스트 목록에서 나온 경우 코드를 실행하여 앨범 목록을 생성합니다. 앨범 목록에서 나온 경우 코드를 실행하여 노래 목록을 생성합니다. – Barak

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 
    } 
} 
관련 문제