2017-09-25 5 views
1

J'ai plusieurs activités qui pourraient utiliser le même adaptateur de tableau. Je voudrais fournir un défaut onLongClick si l'activité ne le mettre en œuvre quelque chose comme pas:L'adaptateur Android fournit la valeur par défaut onLongClick si le parent ne fournit pas l'interface

public class BookAdapter extends ArrayAdapter<Book> { 
... 
    private View.OnLongClickListener onLongClickListener; 
    public BookAdapter(Context context, ArrayList<Book> aBooks) { 
     super(context, 0, aBooks); 
     Log.i(TAG, "caller:" + context.getClass().getSimpleName()); 
     if (context instanceof View.OnLongClickListener) { 
      Log.i(TAG, "yes"); 
      onLongClickListener = (View.OnLongClickListener) 
        context.onLongClickListener(); 
     } 
     else { 
      onLongClickListener = new View.OnLongClickListener() { 
       public boolean onLongClick(View v) 
        String title = 
          ((TextView)(v.findViewById(R.id.tvTitle))) 
          .getText().toString(); 
        Log.v(TAG, "view onLongClick pressed for title \"" 
          + title + "\""); 
        return true; 
       } 
      }; 
     } 
    } 
    @Override 
    public View getView(
     int position, View convertView, ViewGroup parent) { 
     ... 
     convertView.setOnLongClickListener(onLongClickListener); 
     ... 
    } 
... 
} 

Mais je ne peux pas sembler assigner l'appelant onClickListener au onLongClickListener local.

Comment est-ce que je ferais ceci?

Répondre

0

Vous l'avez. J'ai exploré la source de View.java pour voir comment elle était implémentée et la clé consistait à faire passer l'appel à la méthode parente dans la méthode par défaut que je fournis.

public class BookAdapter extends ArrayAdapter<Book> { 
    ... 
    // Ref. to parent if it implements the OnLongClick interface. 
    private View.OnLongClickListener mOnLongClickListener; 
    public BookAdapter(Context context, ArrayList<Book> aBooks) { 
     super(context, 0, aBooks); 
     // save a ref. to the parent if it implements the OnLongClick interface. 
     if (context instanceof View.OnLongClickListener) { 
      mOnLongClickListener = (View.OnLongClickListener)context; 
     } 
    } 
    ... 
    // supply a OnLongClick method. 
    private View.OnLongClickListener getOnLongClickListener() { 
    if (mOnLongClickListener!= null) { 
     return new View.OnLongClickListener() { 
      public boolean onLongClick(View v) { 
       // Call the parent method if it is implemented. 
       return mOnLongClickListener.onLongClick(v); 
      } 
     }; 
    } 
    else { 
     return new View.OnLongClickListener() { 
      public boolean onLongClick(View v) { 
       String title 
        = ((TextView)(v.findViewById(R.id.tvTitle))) 
         .getText().toString(); 
       Log.v(TAG, "view onLongClick pressed for title \"" 
        + title + "\""); 
       return true; 
      } 
     }; 
    } 
} 
    ... 
    public View getView(int position, View convertView, ViewGroup parent) { 
    ... 
     convertView.setOnLongClickListener(getOnLongClickListener()); 
     ...  
    } 
    ... 
} 

S'il y a une manière plus propre de faire ceci, j'aimerais l'entendre.

Merci Steve Smith