2016-06-01 35 views
5

RecyclerView var. Öğe 0, EditText için üstbilgidir, sonra tüm diğer öğeler görüntüdür. EditText'a uzun basarak, seçenek yapıştırması verir. Bu iyi çalışır. Ama geri dönüşümcü görüntüsünü aşağıya kaydırdığımda ve yine en üstte ve uzun basışımda yapıştırma seçeneğini göstermez ve hata verir. Açık ve en üste gelmek için onBindViewHolder numaralı telefonu arayın. Metin seçimini desteklemiyor.. Seçim iptal edildi.EditText verme hatası: TextView, metin seçimini desteklemiyor. Seçim iptal edildi

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

kodunuzu gönderin! –

+0

, adaptörünüzü ve satırın düzen kodunu ve başlıklarını da içine alır. –

+0

hatalarını saptamak için ... aynı sorun için değil, aynı çözüm için çeşitli sorunlar bulabilirsiniz. –

cevap

4

MyEditText.java aşağıdaki sorununuzu çözebilirsiniz kullanma:

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

Aslında, bunu denemek için 3 saatimi aldı çünkü AT TÜM sorunla ilgili gibi görünmüyordu. Ama işe yarıyor! –

+0

EditText'e uzun bir tıklamayla, seçim açılır penceresini göstermek için Editor.performLongClick() öğesini çağırır. – Lucca

9

Bu a known bug in the Android platform olduğunu. İlk başta buna inanmadım, ama yayınlanan @ user2246055 kodu etkili bir çözüm!

Ben sınıflara TextView yerine benim Adaptörü bu eklemeyi tercih: EditText üzerine

 @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

Bunun için çok teşekkürler! Aynı sorunu yaşıyordum ve çözümünüz bana yardımcı oldu. (Bu arada Android 7.1'de) –

+0

Bu benim için çalıştı. = D – benjtupas

1

Uzun tıklama seçimi pop-up pencere göstermek için Editor.performLongClick() arayacak.

önce getInsertionController().show();

Eğer setText() kullandığınızda, TextView'un böyle mInsertionControllerEnabled sıfırlamak için Editor.prepareCursorControllers() arayacak, mInsertionControllerEnabled kontrol eder:

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

Gördüğünüz gibi, rootView pencere türü olmalıdır veya mInsertionControllerEnabled olacak false. Eğer EditText henüz attachToWindow() onBindViewHolder de() değil setText, bu yüzden setEnable() EditText attachToWindow sonra zorlamak için ne zaman

Ama Editör mInsertionControllerEnabled değeri.O seçimi şimdi çalışacaktır sıfırlayın.

İlgili konular