无法在列表视图项目中正确选择文本

Posted

技术标签:

【中文标题】无法在列表视图项目中正确选择文本【英文标题】:can not select texts properly in the listview items 【发布时间】:2012-07-20 06:08:54 【问题描述】:

我用这个方法,android.text.Selection.setSelection(Spannable text, int index),在MyEditText中选择一些文本,一个自定义的类扩展了EditText,同时移动我的手指。它在单个视图中完美运行,但是当我将它应用于 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

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

当你运行这个项目时,你会发现只有列表视图中的第一项是可选择的,另外一个奇怪的事情是你不能选择你圈出的所有文本。

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

真的希望有人能帮帮我!

【问题讨论】:

【参考方案1】:

我的看法是onTouchEvent与滚动不兼容 列表视图的移动,但我对此无能为力。

要解决此问题,请覆盖 Activity.dispatchTouchEvent() (http://developer.android.com/reference/android/app/Activity.html#dispatchTouchEvent(android.view.MotionEvent) 并将其传递给您的 ListView 并最终传递给您的 View。让它先完成它的工作。然后让 View 系统完成它的工作。

【讨论】:

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

以上是关于无法在列表视图项目中正确选择文本的主要内容,如果未能解决你的问题,请参考以下文章

无法在部分列表视图中编辑/删除正确的项目

当键盘出现时,白框会遮挡视图

检查时如何在列表视图中删除文本项?

OnItemClick 在列表视图中无法正常工作

odoo 在列表视图中选择按钮

tableview 不会从第二类正确重新加载