2014-11-06 1 views
0

Есть ли способ зарегистрировать событие onClick для элемента listView, не отправляя намерение через startActivity, а вместо этого просто отправляйте и события с помощью EventBus.Отправить Uri элемента в ListView to Fragment с помощью EventBus onClick

@Override 
    public void onClickListener(AdapterView<?> av,View v, int position, long id){ 
     cursor.moveToPosition(position); 
     String st = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)); 
     Uri uri = Uri.parse(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA))); 
     Log.d("item slected",st); 
     MusicPlayerEvent playerevent = new MusicPlayerEvent(uri); 
     EventBus.getDefault().post(playerevent); 
    } 

Фрагмент:

public class MusicPlayer extends Fragment { 
    MediaPlayer mp; 
    public MusicPlayer() { 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     EventBus.getDefault().register(this); 
     mp = new MediaPlayer(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.fragment_music_player, container, false); 
    } 

    // TODO: Rename method, update argument and hook method into UI event 
    public void onButtonPressed(Uri uri) { 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
    } 

    @Override 
    public void onDetach() { 
     EventBus.getDefault().unregister(this); 
     super.onDetach(); 
    } 
    public interface OnFragmentInteractionListener { 
     public void onFragmentInteraction(Uri uri); 
    } 
    public void onEvent(MusicPlayerEvent playerevent){ 
     try { 
      mp.setDataSource(this.getActivity(), playerevent.uri); 
      mp.prepare(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     mp.start(); 
    } 

} 

класса событий:

public class MusicPlayerEvent { 
    Uri uri; 
    MusicPlayerEvent(Uri uri){ 
     this.uri = uri; 
    } 
} 

Многие вопросы здесь, я уверен, но я хотел бы, по крайней мере, получить представление о том, что я попытка сделать это возможно и, возможно, указатель на некоторые соответствующие примеры или чтение. Может быть, я должен лучше познакомиться с обычными намерениями, прежде чем попытаюсь работать с EventBus, но если я смогу узнать более гибкий вариант, это было бы хорошо.

+0

Я не вижу ошибок в коде. Кроме одного. Вероятно, вы хотите зарегистрировать/отменить регистрацию EventBus в противоположных методах, например onCreate/onDestroy или onAttach/onDetach, в зависимости от того, что вы пытаетесь выполнить. Вот и все. Когда вы отправляете сообщение, он быстро находит onEvent (EventType) у ваших подписчиков и вызывает его. Пока вы работаете в потоке пользовательского интерфейса, проблем не будет. –

+0

@Fedor Kazakov спасибо за ответ, я думаю, что он должен работать, кроме моего onClickListener "не переопределяет метод из его суперкласса" – spintron

ответ

0

Я должен был опубликовать остальную часть своей деятельности. Я думаю, что было бы легче ответить, если бы у меня было. Я не допущу этой ошибки в будущем. Я использую активность списка. Как таковой, подходящим для нас способом является onListItemClick.

@Override 
    public void onListItemClick(ListView parent,View v, int position, long id){ 
     cursor.moveToPosition(position); 
     String st = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)); 
     Uri uri = Uri.parse(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA))); 
     Log.d("item slected",st); 
     MusicPlayerEvent playerevent = new MusicPlayerEvent(uri); 
     EventBus.getDefault().post(playerevent); 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^