Android如何在ListView中使EditText可编辑

Android如何在ListView中使EditText可编辑,android,listview,android-listview,android-edittext,Android,Listview,Android Listview,Android Edittext,我有一个列表视图,每个项目中都有编辑文本,我想知道如何使编辑文本可编辑。。如果我将android:windowSoftInputMode=“adjustPan”设置到清单中,但仅在某些设备上,它似乎可以正常工作。在某些设备上,软键盘覆盖编辑文本 另一方面,如果我没有将android:windowSoftInputMode=“adjustPan”放在清单中,则显示软键盘后,EditText会失去焦点,我必须多次触摸EditText才能将其选中并写入 请帮我解决这个问题 注意:我看到了这篇帖子:没有

我有一个
列表视图
,每个项目中都有编辑文本,我想知道如何使
编辑文本
可编辑。。如果我将
android:windowSoftInputMode=“adjustPan”
设置到清单中,但仅在某些设备上,它似乎可以正常工作。在某些设备上,软键盘覆盖编辑文本

另一方面,如果我没有将
android:windowSoftInputMode=“adjustPan”
放在清单中,则显示软键盘后,
EditText
会失去焦点,我必须多次触摸
EditText
才能将其选中并写入

请帮我解决这个问题


注意:我看到了这篇帖子:没有任何帮助,在尝试在
列表视图中创建
editText
界面失败后,我遇到了另一个问题,我只能对你说“不要!”。当你有足够的项目需要滚动你的
列表视图时,你会遇到更多的麻烦,焦点会在这里和那里跳跃,你需要保存你的
编辑文本的状态等等。似乎一般的想法是,在
ListView
中使用
EditText
是不值得的

经过相当多的研究,我可以提出以下方法来帮助我: 我继承了
ListView
并重写了layoutChildren方法,在该方法中我执行以下操作:

@Override
protected void layoutChildren() {
    super.layoutChildren();
    final EditText tv = (EditText)this.getTag();
    if (tv != null)
    {
        Log.d("RUN", "posting delayed");
        this.post(new Runnable() {

            @Override
            public void run() {
                Log.d("RUN", "requesting focus in runnable");
                tv.requestFocusFromTouch();
                tv.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , tv.getWidth(), tv.getHeight(), 0));
                tv.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , tv.getWidth(), tv.getHeight(), 0));
            }
        });
    }
}
当我知道哪个
EditText
应该获得焦点时(调用adapters getView时我知道这一点),我将这个特定的
EditText
设置为
ListView
的标记。然后ListView将自己展开,我的帖子线程将排队。它运行并请求focus,但在我的例子中,这还不够,所以我还生成了两个
MotionEvents
,它们只是模拟一个点击。显然,这足以使软键盘出现。 下面的答案解释了这背后的原因:

不过我为此做了一个变通办法。。也许会帮助别人

public class EditTextListAdapter extends BaseAdapter {

    /* notes list */
    private ArrayList<SomeData> mSomeData = null;
    /* layout inflater instance */
    private LayoutInflater mInflater;
    /* activity context */
    private Context mContext;

    /* ensure that this constant is greater than the maximum list size */
    private static final int DEFAULT_ID_VALUE = -1;
    /* used to keep the note edit text row id within the list */
    private int mNoteId = DEFAULT_ID_VALUE;

    /**
     * EditTextListAdapter adapter class constructor
     *
     * @param context               activity context
     */
    public FirstTimesListAdapter(Context context) {

        /* get a layout inflater instance */
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        /* load the data */
        mSomeData = SomeData.instance().getData(); 
        /* keep the context */
        mContext = context;
    }

    /**
     * Returns the selected item
     *
     * @return selected item
     */
    public int getSelectedItem() {
        return mSelectedItem;
    }

    public int getCount() {
        return mSomeData.size();
    }

    public Object getItem(int i) {
        return mSomeData.get(i);
    }

    public long getItemId(int i) {
        return i;
    }

    public View getView(final int index, View recycledView, ViewGroup viewGroup) {

        ViewHolder viewHolder;

        if (recycledView == null) {
            /* inflate the list item */
            recycledView = mInflater.inflate(R.layout.listview_item_with_edit_text, viewGroup, false);
            /* get link to the view holder views */
            viewHolder = new ViewHolder();
            viewHolder.note = (EditText) recycledView.findViewById(R.id.first_times_note);
            recycledView.setTag(viewHolder);
        } else {
            /* reuse the same views we load the first time */
            viewHolder = (ViewHolder) recycledView.getTag();
        }

        /* display some notes */
        viewHolder.note.setText(mSomeData.getNotes());

        /* if the last id is set, the edit text from this list item was pressed */
        if (mNoteId == index) { 

            /* make the edit text recive focus */
            viewHolder.note.requestFocusFromTouch();
            /* make the edit text's cursor to appear at the end of the text */
            viewHolder.note.setSelection(viewHolder.note.getText().length());

            /* reset the last id to default value */
            mNoteId = DEFAULT_ID_VALUE;
        }

        /* set a touch listener on the edit text just to record the index of the edit text that was pressed */
        viewHolder.note.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View view, MotionEvent motionEvent) {
                if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
                    /* get the index of the touched list item */
                    mNoteId = index;
                }
                return false;
            }
        });

        return recycledView;
    }

    static class ViewHolder {        
        /* note input */
        EditText note;
    }

}
公共类EditTextListAdapter扩展了BaseAdapter{
/*注释列表*/
private ArrayList mSomeData=null;
/*布局充气器实例*/
私人停车场;
/*活动上下文*/
私有上下文;
/*确保此常量大于最大列表大小*/
私有静态final int DEFAULT_ID_VALUE=-1;
/*用于将注释编辑文本行id保留在列表中*/
private int mNoteId=默认值;
/**
*EditTextListAdapter适配器类构造函数
*
*@param context活动上下文
*/
公共FirstTimeListAdapter(上下文){
/*获取布局充气器实例*/
mInflater=(LayoutInflater)context.getSystemService(context.LAYOUT\u充气机\u服务);
/*加载数据*/
mSomeData=SomeData.instance().getData();
/*保持上下文*/
mContext=上下文;
}
/**
*返回所选项目
*
*@返回所选项目
*/
public int getSelectedItem(){
返回mSelectedItem;
}
public int getCount(){
返回mSomeData.size();
}
公共对象getItem(int i){
返回mSomeData.get(i);
}
公共长getItemId(int i){
返回i;
}
公共视图getView(最终整数索引、视图循环视图、视图组视图组){
持票人持票人;
如果(recycledView==null){
/*使列表项膨胀*/
recycledView=mInflater.inflate(R.layout.listview\u项目\u带有编辑\u文本,视图组,false);
/*获取视图持有者视图的链接*/
viewHolder=新的viewHolder();
viewHolder.note=(EditText)recycledView.findViewById(R.id.first\u times\u note);
recycledView.setTag(viewHolder);
}否则{
/*重用我们第一次加载的相同视图*/
viewHolder=(viewHolder)recycledView.getTag();
}
/*显示一些注释*/
viewHolder.note.setText(mSomeData.getNotes());
/*如果设置了最后一个id,则按下此列表项中的编辑文本*/
如果(mNoteId==索引){
/*使编辑文本成为焦点*/
viewHolder.note.requestFocusFromTouch();
/*使编辑文本的光标显示在文本的末尾*/
viewHolder.note.setSelection(viewHolder.note.getText().length());
/*将最后一个id重置为默认值*/
mNoteId=默认值;
}
/*在编辑文本上设置一个触摸监听器,只记录按下的编辑文本的索引*/
viewHolder.note.setOnTouchListener(新视图.OnTouchListener(){
公共布尔onTouch(视图、运动事件、运动事件){
if(motionEvent.getAction()==motionEvent.ACTION\u UP){
/*获取触摸列表项的索引*/
mNoteId=指数;
}
返回false;
}
});
返回回收视图;
}
静态类视图持有者{
/*注释输入*/
编辑文本注释;
}
}