2017-12-07 5 views
0

Ich versuche, ein View-Objekt in einem Array-Adapter übergeben, um eine Snackbar zu öffnen. Ich muss einen Blick hineinlassen, aber eine endgültige Ansicht vor den ClickListeners funktioniert nicht.Passing View innerhalb ArrayAdapter für Snackbar

Wie kann ich die Ansicht Variable über die PopupMenu.OnMenuItemClickListener und DialogInterface.OnClickListener

Ich mag einen separaten OnMenuItemClickListener zu vermeiden, Erstellen von Parametern.

@Override 
public View getView(final int position, View convertView, final ViewGroup parent) { 
case R.id.exercise_options_area: 

try {//setting texts for custom listView 


      deleteArea.setOnClickListener(new View.OnClickListener() {//set to the linear layout 

       @Override 
       public void onClick(View v) { 
final PopupMenu popup = new PopupMenu(parent.getContext(), v); 
popup.getMenu().add(0, 0, 0, menuIconWithText(parent.getResources().getDrawable(R.drawable.ic_rename), "Rename")); 
//if i try using v in snackbar in this line it works, but I don't want it here, I want it down there. using final view = v does not work 

popup.show(); 
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 

    @Override 
    public boolean onMenuItemClick(MenuItem item) { 

     exerciseName = getItem(position);//no spaces, the exerciseName before rename 
     switch (item.getOrder()) { 
      case 0:///////////////////////RENAME 

       AlertDialog.Builder alertBuilder = new AlertDialog.Builder(parent.getContext()); 
       View viewInput = (LayoutInflater.from(parent.getContext())).inflate(R.layout.user_input, null); 
       final EditText inputExerciseName = viewInput.findViewById(R.id.userInput); 

       alertBuilder.setView(viewInput);//show viewInput which is the editText prompt (user_input.xml) 

       alertBuilder.setCancelable(true) 
         .setTitle("Enter New Exercise Name") 
         .setPositiveButton("Save", new DialogInterface.OnClickListener() { 


          @Override 
          public void onClick(DialogInterface dialog, int which) {//on clicking save 
           if (!mainList.contains(inputExerciseName.getText().toString())) { 
            String renamed = inputExerciseName.getText().toString(); 
            renameItem(position, renamed);//rename in the list 



            if (sp.contains(mostRecent + workoutName + " " + exerciseName + " sets")){//only copy if data exists 
             copySharedPreferencesRename(renamed, workoutName, exerciseName,sp,editor);//rename by copying data to new name 
            } 

            checkSharedPreferencesDeleteExercise(workoutName, exerciseName,sp,editor);//delete the data in old name 
            editor.apply();//apply must be done here since this action is separate 
            //refreshListView();//refresh view 



            ((ExerciseList)mContext).recreate();//refresh activity. for past date it refreshes to current 
            if (visitState.equals("pastDate")){ 


            } 
            else 
            *{ 
             simpleSnackBar("Renamed", "#424242", "#FFFFFF", **NEED VIEW HERE**, Snackbar.LENGTH_LONG);//800 grey, white 
             //debug passes this point, but snackbar does not show with final view v 
            }* 
           } 
           else{ 

            return;//make user enter again 
           } 
          } 
         }) 
         .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {//on clicking cancel 
          public void onClick(DialogInterface dialog, int which) { 
           InputMethodManager imm = (InputMethodManager) parent.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);//remove keyboard 
           imm.hideSoftInputFromWindow(inputExerciseName.getWindowToken(), 0); 
           dialog.dismiss(); 
          } 
         }); 

       AlertDialog dialog = alertBuilder.create(); 
       dialog.show(); 
       dialog.setCanceledOnTouchOutside(false); 
       dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); 

       break; 

Antwort

0

Sie benötigen die rootView Ihre Fragment oder die Wurzel ViewGroup Ihre Activity zu Ihrem ArrayAdapter zu übergeben, wenn es in seinem Konstruktor erstellt wird.

Halten Sie diese Ansicht als ein Feld der ArrayAdapter und verwenden Sie sie für die Anzeige SnackBar s.

SnackBar will die Ansicht, dass es am unteren Rand der anzeigen wird, nehme ich an, dass das nicht das Ergebnis für die getView() Methode Ihres Adapters ist.

+0

Vielen Dank. Ich habe Stunden damit verbracht, habe sogar deine Methode schon einmal ausprobiert, als ich es noch einmal probiert habe, dieses Mal habe ich gemerkt, dass das Problem die Aktivität war.recreate, die es der Snackbar nicht erlaubt zu zeigen. Wüssten Sie, wie man die Snackbar zeigt, wenn die Aktivität aktualisiert wird? –

+0

was meinst du mit Refreshes? Fühlen Sie sich frei, einen Chat zu starten, wir können sehen, ob wir das auch beheben können – elmorabea

Verwandte Themen