2016-03-24 9 views
0

Ich habe eine ListView mit checkedTextview Elemente als Zeilen. Die Listenansicht ist das Layout für eine Navigationsleiste.Disable Listview Artikel klickt, wenn Benutzer nicht Premium-Benutzer ist

Was ich versuche zu erreichen, ist, wenn sie nicht Premium sind, das Play Store-Dialogfeld auffordern und nicht zulassen, dass sie den Status des Schecks ändern. Wenn sie Premium sind, zeigen Sie das Premium-Dialogfeld nicht an und erlauben Sie ihnen, den Status der Kontrollkästchen zu ändern.

Ich versuchte ein if/else an mehreren verschiedenen Stellen zu prüfen, ob sie Premium sind oder nicht, aber es hat nicht funktioniert, weil ich immer noch in der Lage war zu klicken und den Zustand der Checkboxen zu ändern.

Die Elemente in der Listenansicht sind nur Premium-Benutzern zugänglich/anklickbar. Wenn sie nicht Premium sind, wenn ein Benutzer auf ein Listenelement klickt, fordert ein Dialogfeld für die Google-Wiedergabe den Benutzer zum Upgrade auf. Ich habe versucht, viele verschiedene Optionen wie listvivew.setEnabled (false) und setClickable (false) und .invalidate(); unter anderem, aber bisher hat noch nichts geklappt.

private void addDrawerItems() { 
    String[] osArray = {"Bluetooth", "Reply to Calls", "Reply to sms", "customise message"}; 

    mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, osArray); 
    mDrawerList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
    mDrawerList.setAdapter(mAdapter); 



    mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 


     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

      CheckedTextView ctv = (CheckedTextView) view; 


      switch (position) { 

       case 0: 

         if (ctv.isChecked()) { 
          Toast.makeText(getApplicationContext(), "Bluetooth On", Toast.LENGTH_LONG).show(); 
         } else { 
          Toast.makeText(getApplicationContext(), "Bluetooth OFF", Toast.LENGTH_LONG).show(); 
         } 

        break; 

       case 1: 
        if (ctv.isChecked()) { 
         Toast.makeText(getApplicationContext(), "Calls Reply On", Toast.LENGTH_LONG).show(); 
        } else { 
         Toast.makeText(getApplicationContext(), "Calls Reply OFF", Toast.LENGTH_LONG).show(); 
        } 
        break; 

       case 2: 
        if (ctv.isChecked()) { 
         Toast.makeText(getApplicationContext(), "Sms Reply On", Toast.LENGTH_LONG).show(); 
        } else { 
         Toast.makeText(getApplicationContext(), "Sms Reply OFF", Toast.LENGTH_LONG).show(); 
        } 
        break; 

       case 3: 

        Toast.makeText(getApplicationContext(), "Customised Message", Toast.LENGTH_LONG).show(); 

        break; 
      } 
     } 
    }); 
} 

!What my Navigation Drawer Looks like1

+0

Fügen Sie einfach eine Bedingung in Ihren Fällen, bevor Sie den Prüfstatus steuern? (if (userUsesPremiumVersion) {click!} else {Dialog öffnen} - oder haben Sie Probleme bei der Identifizierung von Premiumbenutzern? – yennsarah

+0

"Wenn sie nicht Premium sind, dann wird ein Benutzer durch ein Google Play-Dialogfeld dazu aufgefordert, wenn er auf ein Listenelement klickt upgrade "- also brauchen Sie den ListView OnItemClickListener, um den Dialog auszulösen? Warum sollten Sie ihn dann deaktivieren? – 0X0nosugar

+0

Was ich versuche zu erreichen ist, wenn sie nicht Premium sind, das Play Store-Dialogfeld auffordern und nicht Erlauben Sie ihnen nicht, den Status des Schecks zu ändern.Wenn sie Premium sind, zeigen Sie nicht das Premium-Dialogfeld an, und erlauben Sie ihnen, den Status der Kontrollkästchen zu ändern –

Antwort

1

Sie benötigen die ListView Wahl-Modus von Benutzerberechtigungen abhängig einzustellen.

Wenn wir annehmen, haben Sie eine globale Variable den Benutzerstatus

boolean mIsPremiumUser; 

dann je nach seinem Wert anzuzeigen:

if (mIsPremiumUser) 
{ 
    mDrawerList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); 
} 
else 
{ 
    mDrawerList.setChoiceMode(AbsListView.CHOICE_MODE_NONE); 
} 

Dies wird den überprüfbaren Zustand der Listenelemente wechseln. Die OnItemClickListener muss wie folgt geändert werden:

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
{ 
    CheckedTextView ctv = (CheckedTextView) view; 

    if (! mIsPremiumUser) 
    { 
     // code to display upgrade dialog here 
     return; 
    } 

    switch (position) 
    { 
     case 0: 
     // continue as before... 
    } 
} 
+0

Vielen Dank, dass perfekt funktioniert hat! Genau das, was ich wollte. nur ein Problem, ich starte die App und mIsPremiumUser wird auf false gesetzt, und alles funktioniert so, wie ich es will, aber dann, wenn ich auf eine "Test" -Schaltfläche klicke, die mIsPremiumUser in true geändert hat, kann ich auf die Listenelemente klicken. aber das Kontrollkästchen nicht ändern Sie den Status auf "angekreuzt", und die Toast-Nachrichten immer, d. h. Bluetooth ist ausgeschaltet, oder "Antworten auf Anrufe aus" –

+0

Ich hatte auch eine andere Frage. Wenn der Benutzer für das Bluetooth-Listenelement auf das Kontrollkästchen klickte, wollte ich, dass der Haken ein- oder ausgeschaltet wurde. Wenn der Benutzer jedoch irgendwo in dieser Zeile klickt, wollte ich ein kleines Dialogfeld öffnen, um dem Benutzer die Auswahl aus einem zu ermöglichen Liste der gepaarten Geräte. Ich möchte nur diesen Effekt/Design für das Bluetooth-Listenelement, für die anderen Listenelemente, die der Benutzer irgendwo in dieser Zeile anklicken soll, um das Kontrollkästchen zu aktivieren. –

+0

@Andrew Irvin - Ich habe mit einer kleinen Aktivität mit einer Taste getestet, um den Benutzerzustand genau wie Sie scheinen, um zu tun. Vielleicht ist es das Beste, wenn du etwas von deinem Code in [diesen Chat-Raum] postest (http://chat.stackoverflow.com/rooms/107355/discussion-between-0x0nosugar-and-andrew-irwin) und ich werde einen Blick darauf werfen daran.Über das andere Problem: Ich habe irgendwie das Gefühl, dass das spezielle Verhalten für die Bluetooth-Zeile am besten erreicht wird, indem ein benutzerdefinierter Adapter mit einer benutzerdefinierten ViewGroup als Listenzeile verwendet wird. Dieses Problem verdient sicherlich seine eigene Frage. Nicht zuletzt, weil jemand anders eine elegantere Lösung haben könnte. – 0X0nosugar

Verwandte Themen