2017-09-25 46 views
1

我有幾個活動可以使用同一個陣列適配器。我想提供一個默認的onLongClick如果活動沒有實現它像:如果父母不提供接口,Android適配器會提供默認的onLongClick

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

但我似乎無法給調用者onClickListener分配給本地onLongClickListener。

我該怎麼做?

回答

0

明白了。我通過View.java的源代碼來查看它是如何實現的,關鍵是在我提供的默認方法中調用父方法。

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

如果有更乾淨的方法可以做到這一點,我很樂意聽到它。

謝謝 史蒂夫史密斯