因为公司需要,才去研究这个
最终效果:
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
大家可以下载看一下,并不难实现。