Android 사용자 정의 ListView 는 QQ 를 모방 하여 목록 을 끌 어 당 길 수 있 습 니 다.

17867 단어 androidlistview끌다
우리 의 대체적인 사고방식 은 사실 이런 것 이 고 나의 구상 이다.우 리 는 먼저 간단 한 ListView 의 데 이 터 를 실현 할 수 있다.그러나 그의 Adapter 는 시스템 으로 봉 인 된 다음 에 하나의 실체 류 에 전달 하고 마지막 에 하나의 listview 를 사용자 정의 하여 조작 할 수 있다.그래서 우 리 는 먼저 준비 한 일 을 잘 할 수 있다.예 를 들 어?
list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/iv_logo"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentLeft="true"
android:layout_centerInParent="true"
android:layout_marginLeft="10dp"/>
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@id/iv_logo"/>
</RelativeLayout>
이것 은 단지 하나의 두상 과 한 마디 뿐 이 었 다.그리고 우 리 는 실체 류 도 다 썼 다.
DragBean

package com.liuguilin.draglistviewsample.entity;
/*
*    : DragListViewSample 
*   : com.liuguilin.draglistviewsample.entity
*    : DragBean
*    : LGL
*     : 2016/8/29 22:49
*   :    
*/
public class DragBean {
private int ivId;
private String text;
public DragBean() {
}
public DragBean(int ivId, String text) {
this.ivId = ivId;
this.text = text;
}
public int getIvId() {
return ivId;
}
public String getText() {
return text;
}
}
ok,사실은 아주 간단 합 니 다.id 는 그림 이 고 그 다음 에 텍스트 입 니 다.그러면 우 리 는 Adapter 를 실현 할 수 있 습 니 다.여기 서 저 는 Array Adapter 를 사용 하여 삽입 과 삭 제 를 쉽게 할 수 있 습 니 다.
DragAdapter

package com.liuguilin.draglistviewsample.adapter;
/*
*    : DragListViewSample 
*   : com.liuguilin.draglistviewsample.adapter
*    : DragAdapter
*    : LGL
*     : 2016/8/29 22:41
*   :         
*/
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.liuguilin.draglistviewsample.R;
import com.liuguilin.draglistviewsample.entity.DragBean;
import java.util.List;
public class DragAdapter extends ArrayAdapter<DragBean> {
/**
*     
*
* @param context
* @param mList
*/
public DragAdapter(Context context, List<DragBean> mList) {
super(context, 0, mList);
}
/**
*   View
*
* @param position
* @param convertView
* @param parent
* @return
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
ViewHolder viewHolder;
if (convertView == null) {
view = View.inflate(getContext(), R.layout.list_item, null);
viewHolder = new ViewHolder();
viewHolder.imageView = (ImageView) view
.findViewById(R.id.iv_logo);
viewHolder.textView = (TextView) view.findViewById(R.id.textView);
view.setTag(viewHolder);
} else {
view = convertView;
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.imageView.setImageResource(getItem(position).getIvId());
viewHolder.textView.setText(getItem(position).getText());
return view;
}
/**
*   
*/
static class ViewHolder {
ImageView imageView;
TextView textView;
}
}
네,사실 여기까지 왔 습 니 다.그 는 가장 일반적인 ListView 입 니 다.우 리 는 그 에 게 데 이 터 를 채 워 주 었 습 니 다.
MainActivity

package com.liuguilin.draglistviewsample;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.liuguilin.draglistviewsample.adapter.DragAdapter;
import com.liuguilin.draglistviewsample.entity.DragBean;
import com.liuguilin.draglistviewsample.view.DragListView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
//  
private DragListView mListView;
//  
private List<DragBean> mList = new ArrayList<>();
//   
private DragAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
/**
*    View
*/
private void initView() {
mListView = (DragListView) findViewById(R.id.mListView);
//  
for (int i = 0; i < 30; i++) {
DragBean bean = new DragBean(R.mipmap.ic_launcher, "      " + i);
mList.add(bean);
}
//      
adapter = new DragAdapter(this,mList);
mListView.setAdapter(adapter);
}
}
이제 실제 효 과 를 볼 수 있어 요.
这里写图片描述
이제 저희 ListView 다시 쓸 수 있어 요.
우 리 는 먼저 그의 사건 을 차단 했다.

/**
*            
*          
*        
*
* @param ev
* @return
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
//    
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
//       
int x = (int) ev.getX();
int y = (int) ev.getY();
//                
mStartPosition = mEndPosition = pointToPosition(x, y);
//       logo   
ViewGroup itemView = (ViewGroup) getChildAt(mStartPosition - getFirstVisiblePosition());
//           Y  
dragPoint = y - itemView.getTop();
//ListView     Y  
dragOffset = (int) (ev.getRawY() - y);
//     
View dragger = itemView.findViewById(R.id.iv_logo);
//       logo  
if (dragger != null && x < dragger.getRight() + 10) {
//  ListView     
// 
upScroll = getHeight() / 3;
// 
downScroll = getHeight() * 2 / 3;
//       /  
itemView.setDrawingCacheEnabled(true);
//    
Bitmap bitMap = itemView.getDrawingCache();
//    
startDrag(bitMap, y);
}
break;
}
//        View
return false;
}
그의 position 를 가 져 온 후에 우 리 는 직접 캡 처 하고 우리 의 window 를 표시 합 니 다.여기 서 하 는 일이 비교적 많 습 니 다.우 리 는 프로필 사진 을 눌 렀 는 지 판단 해 야 window 를 표시 할 수 있 습 니 다.

/**
*    Y ,        
*
* @param bitMap
* @param y
*/
private void startDrag(Bitmap bitMap, int y) {
//    
wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
//      
lParams = new WindowManager.LayoutParams();
//    
lParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
lParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
//  
lParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
//     
lParams.alpha = 0.8f;
//    
lParams.gravity = Gravity.TOP;
//  xy
lParams.x = 0;
lParams.y = y-dragPoint + dragOffset;
//  
lParams.format = PixelFormat.TRANSLUCENT;
//    
lParams.windowAnimations = 0;
//  
dragImageView = new ImageView(getContext());
//    
dragImageView.setImageBitmap(bitMap);
//      
wm.addView(dragImageView, lParams);
}
알 겠 습 니 다.window 를 초기 화 하 겠 습 니 다.표시 만 으로 는 안 됩 니 다.우 리 는 미 끄 러 질 수 있 습 니 다.어떻게 감청 합 니까?onTouch Event 의 ACTIONMOVE 사건 은 할 수 있어 요.

/**
*     
*
* @param ev
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
//     
if (dragImageView != null && mEndPosition != INVALID_POSITION) {
//            
switch (ev.getAction()) {
case MotionEvent.ACTION_MOVE:
//     Y      
int moveY = (int) ev.getY();
doDrag(moveY);
break;
//      
case MotionEvent.ACTION_UP:
int upY = (int) ev.getY();
stopDrag();
onDrag(upY);
break;
}
}
//     
return true;
}
우 리 는 이동 할 때 끊임없이 그의 위 치 를 갱신 했다.

/**
*       
*
* @param moveY
*/
private void doDrag(int moveY) {
if (dragImageView != null) {
lParams.y = moveY - dragPoint + dragOffset;
wm.updateViewLayout(dragImageView, lParams);
}
//           -1
int tempLine = pointToPosition(0, moveY);
//     
if (tempLine != INVALID_POSITION) {
//               
mEndPosition = tempLine;
}
//     、    
int scrollSpeed = 0;
//  
if (moveY < upScroll) {
scrollSpeed = 10;
//  
} else if (moveY > downScroll) {
scrollSpeed = -10;
}
//    
if (scrollSpeed != 0) {
//     Y  
int dragItemY = getChildAt(mEndPosition - getFirstVisiblePosition()).getTop();
//    
int dy = dragItemY + scrollSpeed;
//  
setSelectionFromTop(mEndPosition, dy);
}
}
네가 이동 이 끝 난 후에 나 는 너의 window 체 를 멈 출 수 있다.

/**
*      
*/
private void stopDrag() {
//      
if (dragImageView != null) {
wm.removeView(dragImageView);
dragImageView = null;
}
}
이렇게 하면,나 는 직접 너의 position 를 연결 하여 끌 어 당 기 는 효 과 를 얻 을 것 이다.

/**
*       
*
* @param upY
*/
private void onDrag(int upY) {
//      
//           -1
int tempLine = pointToPosition(0, upY);
//     
if (tempLine != INVALID_POSITION) {
//               
mEndPosition = tempLine;
}
/**
*                         
*/
//     
if (upY < getChildAt(1).getTop()) {
mEndPosition = 1;
//     
} else if (upY > getChildAt(getChildCount() - 1).getTop()) {
mEndPosition = getAdapter().getCount() - 1;
}
//    item  
if (mEndPosition > 0 && mEndPosition < getAdapter().getCount()) {
DragAdapter adapter = (DragAdapter) getAdapter();
//       
adapter.remove(adapter.getItem(mStartPosition));
//  
adapter.insert(adapter.getItem(mStartPosition), mEndPosition);
}
}
모든 코드 붙 이기
DragListView

package com.liuguilin.draglistviewsample.view;
/*
*    : DragListViewSample 
*   : com.liuguilin.draglistviewsample.view
*    : DragListView
*    : LGL
*     : 2016/8/29 20:50
*   :      QQ      ListView
*/
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.PixelFormat;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.ListView;
import com.liuguilin.draglistviewsample.R;
import com.liuguilin.draglistviewsample.adapter.DragAdapter;
public class DragListView extends ListView {
//     position
private int mStartPosition;
//     position
private int mEndPosition;
//         Y  
private int dragPoint;
//ListView     Y  
private int dragOffset;
// 
private int upScroll;
// 
private int downScroll;
//  
private WindowManager wm;
//     
private ImageView dragImageView;
//    
private WindowManager.LayoutParams lParams;
//    
public DragListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
*            
*          
*        
*
* @param ev
* @return
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
//    
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
//       
int x = (int) ev.getX();
int y = (int) ev.getY();
//                
mStartPosition = mEndPosition = pointToPosition(x, y);
//       logo   
ViewGroup itemView = (ViewGroup) getChildAt(mStartPosition - getFirstVisiblePosition());
//           Y  
dragPoint = y - itemView.getTop();
//ListView     Y  
dragOffset = (int) (ev.getRawY() - y);
//     
View dragger = itemView.findViewById(R.id.iv_logo);
//       logo  
if (dragger != null && x < dragger.getRight() + 10) {
//  ListView     
// 
upScroll = getHeight() / 3;
// 
downScroll = getHeight() * 2 / 3;
//       /  
itemView.setDrawingCacheEnabled(true);
//    
Bitmap bitMap = itemView.getDrawingCache();
//    
startDrag(bitMap, y);
}
break;
}
//        View
return false;
}
/**
*    Y ,        
*
* @param bitMap
* @param y
*/
private void startDrag(Bitmap bitMap, int y) {
//    
wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
//      
lParams = new WindowManager.LayoutParams();
//    
lParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
lParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
//  
lParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
//     
lParams.alpha = 0.8f;
//    
lParams.gravity = Gravity.TOP;
//  xy
lParams.x = 0;
lParams.y = y-dragPoint + dragOffset;
//  
lParams.format = PixelFormat.TRANSLUCENT;
//    
lParams.windowAnimations = 0;
//  
dragImageView = new ImageView(getContext());
//    
dragImageView.setImageBitmap(bitMap);
//      
wm.addView(dragImageView, lParams);
}
/**
*     
*
* @param ev
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
//     
if (dragImageView != null && mEndPosition != INVALID_POSITION) {
//            
switch (ev.getAction()) {
case MotionEvent.ACTION_MOVE:
//     Y      
int moveY = (int) ev.getY();
doDrag(moveY);
break;
//      
case MotionEvent.ACTION_UP:
int upY = (int) ev.getY();
stopDrag();
onDrag(upY);
break;
}
}
//     
return true;
}
/**
*       
*
* @param upY
*/
private void onDrag(int upY) {
//      
//           -1
int tempLine = pointToPosition(0, upY);
//     
if (tempLine != INVALID_POSITION) {
//               
mEndPosition = tempLine;
}
/**
*                         
*/
//     
if (upY < getChildAt(1).getTop()) {
mEndPosition = 1;
//     
} else if (upY > getChildAt(getChildCount() - 1).getTop()) {
mEndPosition = getAdapter().getCount() - 1;
}
//    item  
if (mEndPosition > 0 && mEndPosition < getAdapter().getCount()) {
DragAdapter adapter = (DragAdapter) getAdapter();
//       
adapter.remove(adapter.getItem(mStartPosition));
//  
adapter.insert(adapter.getItem(mStartPosition), mEndPosition);
}
}
/**
*      
*/
private void stopDrag() {
//      
if (dragImageView != null) {
wm.removeView(dragImageView);
dragImageView = null;
}
}
/**
*       
*
* @param moveY
*/
private void doDrag(int moveY) {
if (dragImageView != null) {
lParams.y = moveY - dragPoint + dragOffset;
wm.updateViewLayout(dragImageView, lParams);
}
//           -1
int tempLine = pointToPosition(0, moveY);
//     
if (tempLine != INVALID_POSITION) {
//               
mEndPosition = tempLine;
}
//     、    
int scrollSpeed = 0;
//  
if (moveY < upScroll) {
scrollSpeed = 10;
//  
} else if (moveY > downScroll) {
scrollSpeed = -10;
}
//    
if (scrollSpeed != 0) {
//     Y  
int dragItemY = getChildAt(mEndPosition - getFirstVisiblePosition()).getTop();
//    
int dy = dragItemY + scrollSpeed;
//  
setSelectionFromTop(mEndPosition, dy);
}
}
}
그리고 인용 하 겠 습 니 다.
layout_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<com.liuguilin.draglistviewsample.view.DragListView
android:id="@+id/mListView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
참,창 추가 권한 잊 지 마 세 요.

<!--    -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
이 일련의 일 을 끝 낸 후에 이 구상 이 사실 옳다 고 생각 한 후에 우 리 는 시험 적 으로 운행 할 수 있다.
这里写图片描述
위 에서 말 한 것 은 소 편 이 소개 한 안 드 로 이 드 사용자 정의 ListView 가 QQ 를 모방 하여 목록 을 끌 수 있 는 기능 을 실현 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기