2016-07-11 25 views
-1

Ich entwickle eine App zum Abspielen von Musik, aber ich habe in den letzten zwei Tagen einen Fehler behoben. Here is a screenshot of the app. Grundsätzlich kann der Benutzer eine neue Ansicht hinzufügen, benennen, wie er will, und eine mp3-Datei auswählen, um auf diese Ansicht zu verlinken.Reset-Symbol der zuletzt angeklickten Ansicht beim Klicken auf eine Ansicht in GridLayout

Wie Sie sehen können Jede Ansicht hat einen Text, der ein kleines Spielsymbol. Dieses Symbol wechselt während der Audiowiedergabe zu einem Pausensymbol. Here you can see the pause icon.

Problem 1: Wenn der Benutzer einen Ton beginnt und dann auf ein anderes Feld klicken, stoppt der vorhergehenden Ton, wie es sollte und der neue Sound beginnt, aber die alten Platz das Symbol auf das Symbol Pause bleibt, und so weiter Auf dem Bildschirm haben viele Quadrate das Pausensymbol, während sie tatsächlich keinen Ton abspielen. Nehmen wir an, der Benutzer klickt auf das absolute erste Quadrat, das in der arrayList der Position 0 entspricht. Dann scrollt der Benutzer bis zu dem Punkt, an dem das Quadrat, auf das er geklickt hat, nicht mehr sichtbar ist. Wenn der Benutzer erneut nach oben scrollt, wird das Spielsymbol beim Abspielen des Klangs aktiviert. Ich dachte, das liegt daran, dass ich in meinem GridAdapter jede neu aufgenommene Ansicht so eingerichtet habe, dass sie das Wiedergabesymbol hat, und ich kann nicht herausfinden, wie ich eine if-Anweisung setzen soll. Wie sollte der Adapter wissen, ob die Box einen Ton abspielt?

Vielen Dank und Liebe.

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 Schnipsel von Interesse:

    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

Verknüpfen Sie Ihren Code nicht mit einer externen Website. Wir brauchen nicht alle Linien nur die lästigen. Fügen Sie ein minimales nachprüfbares Beispiel hinzu. – basic

+0

Ok Ich füge den Code in den Beitrag ein – user11230

Antwort

0

Hier ist eine einfache Möglichkeit, es zu erreichen (ich habe nicht Ihre durchgegangen Code, da das Snippet noch nicht bereitgestellt wurde, sind die unten verwendeten Variablen selbsterklärend):

  1. Zuerst fügt ein Flag isPlaying sagt in der Modellklasse eines Elements in gridview

  2. Jetzt in getView Methode, fügen Sie unter Code

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

  3. Nun klicken Zuhörer angesichts der , fügen Sie dieses hinzu

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

Ich habe gerade die grundlegende Logik geschrieben, müssen Sie Ihren Code in Bezug auf Wiedergabe/Pause Ihrer Songs schreiben. Hoffe das hilft dir.

+0

Danke für Ihren Eintrag Ich werde anfangen, es jetzt zu suchen. Stört es mich zu fragen, was ist eine Flagge? Ich habe noch nichts von ihnen gehört, ich bin ein Neuling. – user11230

+0

Eigentlich habe ich es geschafft, Problem 2 zu lösen, aber nicht Problem 1. Auch jetzt sind einige Blöcke im Raster nicht anklickbar. – user11230

+0

Ein Flag ist grundsätzlich eine Variable (vorzugsweise Boolean, obwohl es ein int oder irgendetwas sein kann), um ein Pass/Fail-Szenario zu validieren oder etwas zu signalisieren, wie in unserem Fall 'isPlaying' variable/flag bedeutet, dass der aktuelle Gegenstand if spielt Sein Wert ist ansonsten wahr und falsch. In ähnlicher Weise hättest du das isPlaying auch als int nehmen können, wenn seine Zero dann nicht spielt und wenn 1, dann spielt es. Ich hoffe du bekommst es. – prateek