2017-09-25 47 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()); 
     ...  
    } 
    ... 
} 

如果有更干净的方法可以做到这一点,我很乐意听到它。

谢谢 史蒂夫史密斯