2012-07-20 61 views
1

我已經使用此方法,android.text.Selection.setSelection(Spannable text,int index),在MyEditText中選擇一些文本,自定義類繼承EditText,while移動我的手指。它在單個視圖中完美運行,但是當我將它應用於ListView中的多個MyEditText項時,它無法正常工作。無法在列表視圖項中正確選擇文本

以下是我的代碼,你也可以下載它形成的github(https://github.com/ruobin/unconstrained-selecting-texts):

MyEditText.java

public class MyEditText extends EditText { 

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

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

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

    private void initialize() { 
     setBackgroundColor(Color.WHITE); 
    } 

    @Override 
    protected void onCreateContextMenu(ContextMenu menu) { 
     // avoid to pop out the context menu 
    } 

    @Override 
    public boolean getDefaultEditable() { 
     return false; 
    } 

    private int offset; 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     int action = event.getAction(); 
     Layout layout = getLayout(); 
     int line = 0; 
     switch (action) { 
     case MotionEvent.ACTION_DOWN: 
      line = layout.getLineForVertical(getScrollY() + (int) event.getY()); 
      offset = layout.getOffsetForHorizontal(line, (int) event.getX()); 
      Selection.setSelection(getEditableText(), offset); 
      break; 
     case MotionEvent.ACTION_MOVE: 
     case MotionEvent.ACTION_UP: 
      line = layout.getLineForVertical(getScrollY() + (int) event.getY()); 
      int curOff = layout 
        .getOffsetForHorizontal(line, (int) event.getX()); 
      Selection.setSelection(getEditableText(), offset, curOff); 
      break; 
     } 
     return true; 
    } 

} 

MyListAdapter.java

public class MyListAdapter extends BaseAdapter { 

    private ArrayList<String> entitys; 
    private Context context; 

    public MyListAdapter(Context context, ArrayList<String> entitys) { 
     this.context = context; 
     this.entitys = entitys; 
    } 

    @Override 
    public int getCount() { 
     if (entitys == null) 
      return 0; 
     return entitys.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     if (entitys == null) 
      return null; 
     return entitys.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     String entity = entitys.get(position); 
     MyEditText myTextView = (MyEditText) View.inflate(context, 
       R.layout.list_item, null); 
     myTextView.setText(entity); 
     return myTextView; 
    } 

} 

CopyTextTest2Activity.java

public class CopyTextTest2Activity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     LinearLayout ll = new LinearLayout(this); 
     ListView lv = new ListView(this); 
     String values; 

     ArrayList<String> stringList = new ArrayList(); 
     for (int i = 0; i < 10; i++) { 
      values = "" + i + " sdfsfjskldfhsklhskdfsdhf" 
        + "fsdfaskhfkshdfkskdfskldf" 
        + "dfskdfhkshdfkshdkiuiouweoruweoruwoeruwoer" 
        + "opkspdfmmbb" + "" + "dsfasdfsdfsdfsdferwre"; 
      stringList.add(values); 
     } 

     MyListAdapter myAdapter = new MyListAdapter(this, stringList); 
     lv.setAdapter(myAdapter); 
     lv.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); 

     ll.addView(lv, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 
     // lv.setEnabled(false); 
     setContentView(ll); 

    } 
} 

list_item.xml

​​3210

當你運行這個項目,你會在ListView只找到的第一個項目是可選擇的,另一個奇怪的是,你不能選擇全部你包圍的文字。

我認爲onTouchEvent與listview的滾動移動不兼容,但我無能爲力。

真的希望有人能幫助我!

回答

1

我的意見是onTouchEvent與列表視圖的滾動 移動不兼容,但我無能爲力。

要解決此問題,請覆蓋Activity.dispatchTouchEvent()(http://developer.android.com/reference/android/app/Activity.html#dispatchTouchEvent(android.view.MotionEvent)並將其傳遞給您的ListView並最終傳遞給您的View。讓它首先做好工作。然後讓View系統完成它的工作。

+0

我不完全理解你的意圖,你會給我一些細節或僞代碼嗎? – 2012-07-20 07:49:29

相關問題