2016-06-01 7 views
5

私はRecyclerViewを持っています。位置0の要素はEditTextのヘッダーです。他のすべての要素は画像です.を長く押すとオプションペーストができます。 しかし、私はリサイクラビューを下にスクロールし、もう一度上に来て長く押すと、貼り付けオプションが表示されず、エラーが表示されます。 オンボトムまでスクロールし、再びトップパスに戻るには、onBindViewHolderを呼び出します。EditTextにエラーがあります:TextViewはテキスト選択をサポートしていません。選択がキャンセルされました

TextViewTextViewは、テキスト選択をサポートしていません。選択がキャンセルされました。

public class Someclass extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements View.OnClickListener { 


    private static final int TYPE_EDIT = 0; 
    private static final int TYPE_IMAGE = 1; 
    List<String> msomelist = new ArrayList<String>(); 

    public void someMethod(List<String> somelist) { 

     msomelist.clear(); 
     msomelist.addAll(somelist); 
     notifyDataSetChanged(); 

    } 




    public Someclass(Activity activity, List<String> somelist) { 
     this.activity = activity; 
     this.msomelist.clear(); 
     this.msomelist.addAll(somelist); 
     mContext = activity; 
    } 

    @Override 
    public int getItemViewType(int position) { 

     if (position == 0) 
      return TYPE_EDIT; 

     return TYPE_IMAGE; 
    } 

    @Override 
    public void onClick(View view) { 
     int postition = (int) view.getTag(); 
     msomelist.remove(postition); 
     notifyDataSetChanged(); 

    } 

    public static class ViewHolder extends RecyclerView.ViewHolder { 
     ImageView img; 

     public ViewHolder(View itemView) { 
      super(itemView); 

      img = (ImageView) itemView.findViewById(R.id.image); 
     } 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     if (viewType == TYPE_IMAGE) { 
      View view = LayoutInflater.from(mContext) 
        .inflate(somelayout, false); 
      ViewHolder holder = new ViewHolder(view); 
      return holder; 
     } else { 
      View view = LayoutInflater.from(mContext) 
        .inflate(someotherlayout, false); 


      return new OtherHolder(view); 
     } 
    } 

    class OtherHolder extends RecyclerView.ViewHolder { 
     EditText editText; 

     public OtherHolder(View itemView) { 
      super(itemView); 
      editText = (EditText) itemView.findViewById(R.id.ediItext); 
      editText.requestFocus(); 
     } 
    } 

    @Override 
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { 

     if (holder instanceof ViewHolder) { 
      some function..... 
     } else if (holder instanceof OtherHolder) { 
      some function 
     } 
    } 
} 
+3

あなたのコードを投稿してください! –

+0

アダプターと行のレイアウトコードとヘッダーも入力してください。エラー –

+0

done..iを特定するには、同じ問題解決のために提出されたさまざまな問題を見つけることができます。 –

答えて

4

MyEditText.javaを使用すると、あなたの問題を解決することができます

public class MyEditText extends EditText { 
private boolean mEnabled; // is this edittext enabled 

public MyEditText(Context context) { 
    super(context); 
} 

public MyEditText(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public MyEditText(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

@Override 
protected void onAttachedToWindow() { 
    super.onAttachedToWindow(); 
    try { 
     if (!mEnabled) return; 
     super.setEnabled(false); 
     super.setEnabled(mEnabled); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
public void setEnabled(boolean enabled) { 
    this.mEnabled = enabled; 
    super.setEnabled(enabled); 
}} 
+0

実際、問題はAT ALLに関連しているかのように見えなかったので、これを試すには3時間かかりました。しかし、それは動作します! –

+0

EditTextを長押しするとEditor.performLongClick()が呼び出され、選択ポップアップウィンドウが表示されます。 – Lucca

9

これはa known bug in the Android platformです。最初は信じられませんでしたが、コード@ user2246055が有効な回避策です!

私が代わりにサブクラス化のTextViewの私のアダプタでこれを添加することが好ましい:

 @Override 
     public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) { 
      super.onViewAttachedToWindow(holder); 

      // Bug workaround for losing text selection ability, see: 
      // https://code.google.com/p/android/issues/detail?id=208169 
      holder.textView.setEnabled(false); 
      holder.textView.setEnabled(true); 
     } 
+0

ありがとうございました!私は同じ問題を経験していて、あなたのソリューションは私を助けました。 (途中でアンドロイド7.1で) –

+0

これは私のために働いた。 = D – benjtupas

1

ロングクリックしEditTextには、選択ポップアップウィンドウを表示するにはEditor.performLongClick()を呼び出します。ご覧のよう

boolean windowSupportsHandles = false; 

ViewGroup.LayoutParams params = mTextView.getRootView().getLayoutParams(); 
if (params instanceof WindowManager.LayoutParams) { 
    WindowManager.LayoutParams windowParams = (WindowManager.LayoutParams) params; 
    windowSupportsHandles = windowParams.type < WindowManager.LayoutParams.FIRST_SUB_WINDOW 
      || windowParams.type > WindowManager.LayoutParams.LAST_SUB_WINDOW; 
} 

boolean enabled = windowSupportsHandles && mTextView.getLayout() != null; 
mInsertionControllerEnabled = enabled && isCursorVisible(); 

rootViewは、ウィンドウタイプまたはmInsertionControllerEnabledでなければなりませんようになります。getInsertionController().show();

あなたがsetText()を使用する場合、それは、mInsertionControllerEnabledをチェックし、TextViewには、このようなmInsertionControllerEnabledをリセットするためにEditor.prepareCursorControllers()を呼び出しますfalse。エディタを強制するEditText attachToWindowがmInsertionControllerEnabled value.Thenの選択は、現在動作しますリセット後onBindViewHolder

しかしときsetText()()、EditTextはまだattachToWindowではないので、我々がすべきsetEnable()。

関連する問題