Android 사용자 정의 ListView 는 QQ 를 모방 하여 목록 을 끌 어 당 길 수 있 습 니 다.
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;
}
}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;
}
}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;
}
/**
*    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 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);
}
}
/**
*      
*/
private void stopDrag() {
//      
if (dragImageView != null) {
wm.removeView(dragImageView);
dragImageView = null;
}
}
/**
*       
*
* @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 를 모방 하여 목록 을 끌 수 있 는 기능 을 실현 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.