Android 无法在listview项目中正确选择文本

Android 无法在listview项目中正确选择文本,android,listview,android-edittext,selection,Android,Listview,Android Edittext,Selection,我使用了这个方法android.text.Selection.setSelection(Spannable text,int index)来选择MyEditText中的一些文本,一个自定义类在移动手指的同时扩展了EditText。它在单个视图中工作得很好,但当我将它应用于ListView中的多个MyEditText项时,它无法正常工作 以下是我的代码,您也可以从github()下载: MyEditText.java public class MyEditText extends Edit

我使用了这个方法android.text.Selection.setSelection(Spannable text,int index)来选择MyEditText中的一些文本,一个自定义类在移动手指的同时扩展了EditText。它在单个视图中工作得很好,但当我将它应用于ListView中的多个MyEditText项时,它无法正常工作

以下是我的代码,您也可以从github()下载:

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;
    }

}
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;
    }

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

    }
}
MyListAdapter.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;
    }

}
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;
    }

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

    }
}
公共类MyListAdapter扩展BaseAdapter{
私有ArrayList实体;
私人语境;
公共MyListAdapter(上下文、ArrayList实体){
this.context=上下文;
this.entitys=entitys;
}
@凌驾
public int getCount(){
if(entitys==null)
返回0;
返回entitys.size();
}
@凌驾
公共对象getItem(int位置){
if(entitys==null)
返回null;
返回实体get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
字符串实体=entitys.get(位置);
MyEditText myTextView=(MyEditText)视图。充气(上下文,
R.layout.list_项,空);
myTextView.setText(实体);
返回myTextView;
}
}
CopyTextTest2Activity.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;
    }

}
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;
    }

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

    }
}
公共类CopyTextTest2Activity扩展活动{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
LinearLayout ll=新的LinearLayout(本);
ListView lv=新的ListView(本);
字符串值;
ArrayList stringList=新建ArrayList();
对于(int i=0;i<10;i++){
值=”“+i+“sdfsfjskldfhsklhskdfsdhf”
+“fsdfaskhfksshdfkskdfskldf”
+“DFSKDFHKSHDFKIUUWEORUWEORUWERUWOER”
+“opkspdfmmbb”+“”+“dsfasdfsre”;
stringList.add(值);
}
MyListAdapter myAdapter=新的MyListAdapter(此为stringList);
lv.设置适配器(myAdapter);
lv.setDescendantFocusability(ViewGroup.FOCUS在子体之后);
ll.addView(lv、LayoutParams.FILL\u父级、LayoutParams.FILL\u父级);
//lv.setEnabled(错误);
setContentView(ll);
}
}
list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<ss.test.MyEditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" />

当你运行这个项目时,你会发现listview中只有第一个项目是可选择的,另一件奇怪的事情是你不能选择你所包围的所有文本

我的观点是onTouchEvent与listview的滚动运动不兼容,但对此我无能为力

真希望有人能帮我

我的意见是onTouchEvent与卷轴不兼容 listview的移动,但我对此无能为力

要解决此问题,请重写Activity.dispatchTouchEvent()(),并将其传递给ListView,最终传递给视图。让它先做它的工作。然后让视图系统完成它的工作

我的意见是onTouchEvent与卷轴不兼容 listview的移动,但我对此无能为力


要解决此问题,请重写Activity.dispatchTouchEvent()(),并将其传递给ListView,最终传递给视图。让它先做它的工作。然后让视图系统完成它的工作。

我不完全理解你的意图,你能给我一些细节或伪代码吗?我不完全理解你的意图,你能给我一些细节或伪代码吗?