因爲公司需要,纔去研究這個
最終效果:
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
大家可以下載看一下,並不難實現。