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


大家可以下載看一下,並不難實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章