2016-07-11 3 views
-1

Я занимаюсь разработкой приложения для воспроизведения музыки, но за последние два дня я застал исправление ошибки. Here is a screenshot of the app. В принципе пользователь может добавить новое представление, назовите его, однако он пожелает и выберет mp3-файл для ссылки на этот вид.Сброс значка последнего щелкнутого вида при нажатии на вид в GridLayout

Как вы можете видеть Каждый вид имеет текст, который немного воспроизводит значок. Этот значок переключается на значок паузы во время воспроизведения звука. Here you can see the pause icon.

Выпуск 1: Когда пользователь запускает звук, а затем нажмите на другой квадрат, предыдущий звук останавливается, как он должен и новый звук начинается, но значок старой площади в остается значок паузы и т.д. на экране во многих квадратах будет значок паузы, а на самом деле не воспроизводится звук.

Выпуск 2: Допустим, что пользователь нажмет абсолютный первый квадрат, который в ArrayList соответствует положение 0. Тогда пользователь прокручивает вниз к точке, что квадрат он нажал уже не видно. Когда пользователь снова прокручивается, квадрат, на который он щелкнул, будет иметь набор иконок для воспроизведения при воспроизведении звука. Я подумал, что это связано с тем, что в моем GridAdapter я устанавливаю каждый новый recicled view, чтобы иметь значок воспроизведения, и я не могу понять, как установить оператор if. Как адаптер должен знать, что коробка играет звук?

Большое спасибо и любите.

GridItemAdapter.java:

public class GridItemAdapter extends ArrayAdapter<GridItem> { 

    private static final String LOG_TAG = GridItemAdapter.class.getSimpleName(); 


    public GridItemAdapter(Activity context, ArrayList<GridItem> gridItems) { 
     // Here, we initialize the ArrayAdapter's internal storage for the context and the list. 
     // the second argument is used when the ArrayAdapter is populating a single TextView. 
     // Because this is a custom adapter for two TextViews and an ImageView, the adapter is not 
     // going to use this second argument, so it can be any value. Here, we used 0. 
     super(context, 0, gridItems); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // Check if the existing view is being reused, otherwise inflate the view 
     View gridItemView = convertView; 
     if(gridItemView == null) { 
      gridItemView = LayoutInflater.from(getContext()).inflate(
        R.layout.grid_item, parent, false); 
     } 

     // Get the {@link AndroidFlavor} object located at this position in the list 
     GridItem currentGridItem = getItem(position); 

     // Find the TextView in the list_item.xml layout with the ID version_name 
     TextView nameTextView = (TextView) gridItemView.findViewById(R.id.text_1); 
     // set this text on the name TextView 
     nameTextView.setText(currentGridItem.getSoundName()); 

     ImageView playIcon = (ImageView) gridItemView.findViewById(R.id.image_1); 

     playIcon.setImageResource(R.drawable.play_ic); 




     // Return the whole list item layout (containing 2 TextViews and an ImageView) 
     // so that it can be shown in the ListView 
     return gridItemView; 
    } 

} 
  • MainActivity.java фрагменты интереса:

    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
          @Override 
          public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
    
          /* 
          if (lastPosition != -1) { 
           Log.v(TAG3, "Inisde if block, lastposition = " + lastPosition); 
           // Whatever position you're looking for 
           int firstPosition = gridView.getFirstVisiblePosition(); 
           int wantedChild = lastPosition - firstPosition; 
           View wantedView = gridView.getChildAt(wantedChild); 
    
           Log.v(TAG3, "lastRow initiated, lastrow = " + wantedView); 
           ImageView lastIc = (ImageView) wantedView.findViewById(R.id.image_1); 
           lastIc.setImageResource(R.drawable.play_ic); 
    
          } 
          */ 
    
          togglePlayback(i, view); 
          lastPosition = i; 
          Log.v(TAG3, "outside if block, lastPosition = " + lastPosition); 
         } 
        }); 
    
    public void togglePlayback(int i, View v){ 
        final View view = v; 
    
        if(!isPlaying) { 
         releaseMediaPlayer(); 
    
         ImageView playIc = (ImageView) view.findViewById(R.id.image_1); 
         playIc.setImageResource(R.drawable.pause_ic); 
         GridItem word = gridItems.get(i); 
    
    
         try { 
          mMediaPlayer = MediaPlayer.create(MainActivity.this, Uri.parse(word.getSoundPath())); 
         }catch (IllegalArgumentException e){ 
          e.printStackTrace(); 
         } 
         mMediaPlayer.start(); 
         isPlaying = true; 
    
         mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
          @Override 
          public void onCompletion(MediaPlayer mediaPlayer) { 
           releaseMediaPlayer(); 
           ImageView playIc = (ImageView) view.findViewById(R.id.image_1); 
           playIc.setImageResource(R.drawable.play_ic); 
           isPlaying = false; 
          } 
         }); 
        }else{ 
         releaseMediaPlayer(); 
         ImageView playIc = (ImageView) view.findViewById(R.id.image_1); 
         playIc.setImageResource(R.drawable.play_ic); 
         isPlaying = false; 
        } 
    
    
    
    } 
    
+0

Не связывайте свой код с внешним сайтом. Нам не нужны все строки только неприятные. Добавьте минимальный проверяемый пример. – basic

+0

Хорошо, я добавлю код в сообщение – user11230

ответ

0

Вот простой способ добиться этого (я не прошел через ваш код, поскольку фрагмент еще не был предоставлен, используемые ниже переменные не требуют пояснений):

  1. Сначала добавьте флаг сказать isPlaying в модели класса элемента в GridView

  2. Теперь в методе GetView, добавьте ниже код

    if(itemList.get(index).isPlaying) { //set the icon to pause one } else { //set the icon to playing one }

  3. Теперь, щелчок слушателя зрения в , добавить это

    if(itemList.get(index).isPlaying) { // write the code to pause the current song } else { // pause your <previousIndex> song // play <index> item itemList.get(index).isPlaying = true; itemList.get(previousIndex).isPlaying = false; previousIndex = index; notifyDataSetChanged(); }

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

+0

Спасибо за вашу запись. Я начну изучать его сейчас. Вы не возражаете, я спрашиваю, что такое флаг? Я еще не слышал о них, я новичок. – user11230

+0

На самом деле, благодаря вам мне удалось решить проблему 2, но не выпуск 1. Также теперь некоторые блоки в сетке не доступны для кликов. – user11230

+0

Флаг в основном представляет собой переменную (предпочтительно логическую, хотя она может быть int или что-то еще), чтобы проверить сценарий pass/fail или что-то обозначить, например, в нашем случае переменная/isPlaying'/flag означает, что текущий элемент воспроизводится, если его значение истинно и false в противном случае. Точно так же вы могли бы взять isPlaying как int также, скажем, если его Zero тогда его не играет, а если 1, то его игра. Надеюсь, вы это поняли. – prateek