单击编辑文本时显示ListView中的最后一项

时间:2011-03-16 06:57:02

标签: android

目前我这样做是为了在点击编辑文本后获得listview中最后一项的焦点:

    bodyText.setOnFocusChangeListener(new OnFocusChangeListener() {

        public void onFocusChange(View v, boolean hasFocus) {               
            getListView().setSelection(getListView().getCount());
        }
    });

    bodyText.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {
            getListView().setSelection(getListView().getCount());
        }
    });

它很好用并抓住最后一项,问题是软键盘出现并覆盖列表视图中的最后3项。有没有办法显示软键盘出现后的最后一项并调整屏幕大小?谢谢!

4 个答案:

答案 0 :(得分:18)

我自己创建了自定义ListView:

public class CustomListView extends ListView {

public CustomListView (Context context) {
    super(context);
}

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

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

@Override
protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld) {
    super.onSizeChanged(xNew, yNew, xOld, yOld);

    setSelection(getCount());

}
}

您必须包含所有3个构造函数,否则将抛出异常。

然后在您通常放置的XML中

ListView

android:id="@+id/android:list"
android:layout_width="fill_parent" 
android:layout_height="fill_parent"

ListView 更改为 com.blah.blah.CustomListView

对于凌乱的布局感到抱歉,由于某种原因,我无法使格式化程序正常工作。

运行您的应用程序。现在,当您单击EditText时,它会显示软键盘显示后的最后一项!请注意,当您在EditText中键入文本时出现自动完成功能时会出现一些限制,由于ListView的大小发生变化,它也会显示最后一项。

享受!

答案 1 :(得分:2)

@Maurice提供的解决方案几乎是正确的(或者至少它几乎适用于我)。我不得不修改onSizeChanged方法以将setSelection放入post的调用中,如下所示:

@Override
protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld) {
    super.onSizeChanged(xNew, yNew, xOld, yOld);

    post(new Runnable() {
        public void run() {
            setSelection(getCount());
        }
    });
}

Per the docs,post"使Runnable被添加到消息队列中。 runnable将在用户界面线程上运行。"这也是一些Android AbsListView源中使用的技术。

答案 2 :(得分:0)

使用

<activity
.....
android:windowSoftInputMode="adjustResize" />

在您的清单文件中。

答案 3 :(得分:0)

对于使用推荐的新RecyclerView小部件的人:

就像接受的答案一样,但是替换:

setSelection(getCount());

用这个:

 (LinearLayoutManager)getLayoutManager())
.scrollToPositionWithOffset(getAdapter().getItemCount() - 1, 0);

只有LinearLayoutManagerStaggeredGridLayoutManager才有此方法。所以请使用此LayoutManagers