现在的位置: 首页 > 综合 > 正文

Android入门-ListView-自定义adapter和滑动解锁

2018年03月19日 ⁄ 综合 ⁄ 共 4181字 ⁄ 字号 评论关闭

最近有接到一个功能开发,就是在锁屏界面显示未读短信和未接电话,并且每条都滑动解锁进入相应处理程序。

未读短信就进入短信列表,未接电话就进入未接电话列表。项目太大,不方便分析,我这里就直接按小功能剥离分析下一个子功能:

为ListView内的Item添加解锁事件

(1)首先介绍解锁demo的item布局,整个解锁app主layout就是一个ListView

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/itemLayout"
    android:layout_width="fill_parent"
    android:layout_height="63dip"
    android:layout_gravity="center"
    android:layout_marginTop="200dip" >

    <TextView
        android:id="@+id/bgTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:autoLink="all"
        android:textColor="#f8f8f8" >
    </TextView>

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/bgTextView" >
    </Button>

    <ImageView
        android:id="@+id/moveImage"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_marginRight="20dip"
        android:layout_toRightOf="@id/bgTextView"
        android:visibility="invisible" >
    </ImageView>

    <ImageView
        android:id="@+id/getup_arrow"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginRight="20dip"
        android:background="@anim/slider_tip_anim"
        android:visibility="invisible" >
    </ImageView>

</RelativeLayout>

布局有点乱,一个相对布局,里面有背景字bgTextView和一个按键btn(测试用,功能无关),一个解锁图标moveImage,和一个滑动解锁动态图getup_arrow。

(2)然后介绍主activity,activity中主要完成对listview的初始化绘图过程。

listView = new ListView(this);
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> map = new HashMap<String, Object>();
map.put("bg", "解锁查看 10086");
map.put("anim", R.anim.slider_tip_anim);
map.put("move", R.drawable.ic_launcher);
list.add(map);
......
		
ListAdapter adapter = new ListAdapter(this, list, R.layout.item,
		new String[] { "bg", "anim", "move"}, new int[] {
				R.id.bgTextView, R.id.getup_arrow, R.id.moveImage });
listView.setItemsCanFocus(false);
listView.setAdapter(adapter);

(3)其中重头戏要来了,那就是自定义的ListAdapter继承自SimpleAdapter,关于解锁和滑动一些细节都是在adapter里面实现的。

重写其getView方法。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
	View v = super.getView(position, convertView, parent);
	v.setOnTouchListener(new TouchListener());
	ViewHolder holder = (ViewHolder) v.getTag();
	if (holder == null) {
		holder = new ViewHolder();
		holder.move = (ImageView) v.findViewById(R.id.moveImage);
		holder.btn = (Button)v.findViewById(R.id.btn);
		holder.iv = (ImageView) v.findViewById(R.id.getup_arrow);
		holder.tv = (TextView) v.findViewById(R.id.bgTextView);
		v.setTag(holder);
	}
		
	return v;
}
class ViewHolder {
	ImageView move;
	Button btn;
	ImageView iv;
	TextView tv;
}

这里获取资源选择用ViewHolder间接获取,

 

(4)重写OnTouchListener的onTouch方法来绘制滑动解锁图片:

	class TouchListener implements OnTouchListener {

		@Override
		public boolean onTouch(View v, MotionEvent event) {
			// TODO Auto-generated method stub
			int x = (int) event.getX();
			View imageMove = ((ViewHolder) v.getTag()).move;
			View text = ((ViewHolder) v.getTag()).tv;
			View image = ((ViewHolder) v.getTag()).iv;
			View btn = ((ViewHolder) v.getTag()).btn;
			
			Button button = (Button)btn;
			button.setText("TEXT");
			
			ImageView im = (ImageView)imageMove;
			ConstantState d = mContext.getResources().getDrawable(R.drawable.getup_slider_ico_pressed).getConstantState();
			boolean a = im.getDrawable().getConstantState().equals(d);
			//Log.i("Fred"," tv:id = "+Integer.toHexString(tv.getId()));
			Log.i("Fred"," iv.getBackground()==d "+ a);
			
			switch (event.getAction()) {
			case MotionEvent.ACTION_DOWN:
				image.setVisibility(View.VISIBLE);
				imageMove.setVisibility(View.VISIBLE);
				imageMove.setX(text.getRight());
				mLastX = x;
				v.invalidate();
				return true;
			case MotionEvent.ACTION_MOVE:
				imageMove.setX(imageMove.getX() + x - mLastX);
				mLastX = x;
				v.invalidate(); 
				return true;
			case MotionEvent.ACTION_UP:
			case MotionEvent.ACTION_CANCEL:
				image.setVisibility(View.INVISIBLE);
				imageMove.setVisibility(View.INVISIBLE);
				boolean isSucess = Math.abs(imageMove.getX() - v.getWidth()) <= 150 ;
				if(isSucess){
					v.invalidate();
					Toast.makeText(mContext, "解锁成功", 1000).show();
				}else{
					int distance = x - imageMove.getRight();
					if(distance>0){
						v.invalidate();
					}else{
						mLastX = 1000;
						v.invalidate();
					}		
				}
				return true;
			default:
				image.setVisibility(View.INVISIBLE);
				imageMove.setVisibility(View.INVISIBLE);
			
			}
			return false;
		}
	}

运行效果就是touch这个listview的某一个item会出现解锁图片和解锁动态,滑动图片至最右,显示解锁成功。

 

程序demo在这里,小伙伴们施舍1分下载来看看吧,嘿嘿。

里面有ListView的adapter自定义;textView的autolink及点击事件,挺划算的。

 

 http://download.csdn.net/detail/mrdemigod/6453891

抱歉!评论已关闭.