2017-09-25 17 views
1

同じアレイアダプタを使用できるいくつかのアクティビティがあります。親がインターフェイスを提供しない場合、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); 
     ... 
    } 
... 
} 

しかし、私は地元のonLongClickListenerに発信者をonClickListener割り当てるように見えることはできません。私は、活動はそれをのようなものを実装していない場合は、デフォルトをonLongClick供給したいと思います。

どうすればよいですか?

答えて

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

これを行うには、よりクリーンな方法があれば、私はそれを聞いてみたいです。

ありがとう スティーブスミス

関連する問題