无法在列表视图项目中正确选择文本
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 系统完成它的工作。
【讨论】:
我不完全理解你的意图,你能给我一些细节或伪代码吗?以上是关于无法在列表视图项目中正确选择文本的主要内容,如果未能解决你的问题,请参考以下文章