android类似微信朋友圈评论效果,listview定位,item总在输入法上面的位置

来源:互联网 发布:linux mysql user表 编辑:程序博客网 时间:2024/04/28 04:34

因为公司需要,才去研究这个

最终效果:

1、点击任何一个item的评论按钮,出现评论框,弹出输入法,这个item恰好在输入法上边

实现思路:

主要是设置listview中item的位置,其实 ,设置它的位置,主要有两个访求:

listView.setSelection(int position)       设置某个item滚动到当前的顶部

 listView.setSelectionFromTop(int position,int top)   设置某个item滚动到距离当前页面,但不是顶部,而是距离顶部的某个位置,距离为top参数

还有一个listView.getBottom,返回这个listview的底部的x坐标,其实 ,这样就可以了:


viewHeight为listview中每个item的高度,

listview.getBottom为这个listview的高度,

position为当前点击的item在listview中的位置,


这样的话,捕获点击事件,在点击事件里设置listview.setSelectionFromTop(position,listview.getBottom-viewheight),就可以让这个item移到屏幕底部。

其实 ,在实际使用过程中,因为每次使用过程中,都会弹出输入法,所以,之前listview.getBottom还是没有输入法弹出时的高度,所以造成位置不正确。我的解决办法是,重写自定义listview继承ListVIew,然后里面有个onSizeChanged方法 ,会在ListView尺寸变化的时候调用,我在这里添加了一个回调,然后,在回调里,再次获取listview的尺寸的就可以了。

自定义的listVIew如下:


package com.carlos.mylistview;import android.content.Context;import android.util.AttributeSet;import android.widget.ListView;/** * Created by Administrator on 2015/12/30. */public class MyListView extends ListView {    private OnSizeChangedListener onSizeChangedListener;    public void setOnSizeChangedListener(OnSizeChangedListener onSizeChangedListener) {        this.onSizeChangedListener = onSizeChangedListener;    }    interface OnSizeChangedListener {        public void onSizeChanged();    }    public MyListView(Context context) {        super(context);    }    public MyListView(Context context, AttributeSet attrs) {        super(context, attrs);    }    public MyListView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    @Override    protected void onSizeChanged(int w, int h, int oldw, int oldh) {        super.onSizeChanged(w, h, oldw, oldh);        onSizeChangedListener.onSizeChanged();    }}


然后是主activity:


package com.carlos.mylistview;import android.content.Context;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.view.inputmethod.InputMethodManager;import android.widget.EditText;import android.widget.ListView;import android.widget.Toast;public class MainActivity extends AppCompatActivity implements MyListView.OnSizeChangedListener, View.OnClickListener {    private ListView listView;    private EditText editText;    /**     * item的高度     */    private int viewHeight;    /**     * 当前点击的位置     */    private int position;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        editText = (EditText) findViewById(R.id.editText);        listView = (ListView) findViewById(R.id.listView);        //因为是自定义的ListView,所以在这里设置回调        ((MyListView) listView).setOnSizeChangedListener(this);        listView.setAdapter(new MainAdapter(this, this));    }    /**     * ListView尺寸改变后的回调     */    @Override    public void onSizeChanged() {        listView.setSelectionFromTop(position, listView.getBottom() - viewHeight);    }    @Override    public void onClick(View v) {        //获取当前点击的位置        position = (int) v.getTag();        Toast.makeText(this, "点击了" + position, Toast.LENGTH_LONG).show();        //获取点击的那个Item的高度        viewHeight = ((View) v.getParent()).getHeight();        editText.requestFocus();        InputMethodManager inputManager =                (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);        inputManager.showSoftInput(editText, 0);    }}
如下图,这是实现的最终效果:



如果没有看明白,我已经把项目分享到了github上,大家可以去下载源码:


https://github.com/ws123/MyListView


大家可以下载看一下,并不难实现。

0 1
原创粉丝点击