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

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

最终效果:

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


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

你可能感兴趣的:(android开发)