Android学习自定义View(四)——继承控件(滑动时ListView的Item出现删除按钮)
发布日期:2021-06-30 11:14:23
浏览次数:2
分类:技术文章
本文共 4778 字,大约阅读时间需要 15 分钟。
MainActivity如下:
package cc.testviewstudy4;import java.util.ArrayList;import java.util.HashMap;import cc.testviewstudy4.ListViewSubClass.OnDeleteListener;import android.os.Bundle;import android.widget.SimpleAdapter;import android.app.Activity;/** * Demo描述: * 关于自定义View的学习(四) * * 自定义View的实现方式大概可以分为三种: * 自绘控件、组合控件、以及继承控件 * 在此Demo中实现继承控件: * 自定义ListView.在ListView的Item上滑动时可出现一个 * 删除View.点击它,可删除ListView中的该条数据 * * 学习资料: * http://blog.csdn.net/guolin_blog/article/details/17357967 * Thank you very much * */public class MainActivity extends Activity { private ListViewSubClass mListView; private SimpleAdapter mSimpleAdapter; private ArrayList> mArrayList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); init(); } private void init(){ mListView=(ListViewSubClass) findViewById(R.id.listView); mArrayList=new ArrayList >(); HashMap hashMap=null; for (int i = 0; i <12; i++) { hashMap=new HashMap (); hashMap.put("name", "小明"+i); mArrayList.add(hashMap); } mSimpleAdapter=new SimpleAdapter(this, mArrayList, R.layout.listviewitem, new String []{"name"}, new int[]{R.id.name}); mListView.setAdapter(mSimpleAdapter); mListView.setOnDeleteListener(new OnDeleteListener() { @Override public void onDelete(int index) { mArrayList.remove(index); mSimpleAdapter.notifyDataSetChanged(); } }); }}
ListViewSubClass如下:
package cc.testviewstudy4;import android.content.Context;import android.util.AttributeSet;import android.view.GestureDetector;import android.view.GestureDetector.OnGestureListener;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.view.ViewGroup;import android.widget.ListView;import android.widget.RelativeLayout;public class ListViewSubClass extends ListView implements OnGestureListener,OnTouchListener { private GestureDetector mGestureDetector; private OnDeleteListener mDeleteListener; private View mDeleteView; private ViewGroup mListViewItemViewGroup; private int selectedItem; private boolean isDeleteShowing; public ListViewSubClass(Context context) { super(context); } public ListViewSubClass(Context context, AttributeSet attrs) { super(context, attrs); // 监听Touch this.setOnTouchListener(this); // 手势 mGestureDetector = new GestureDetector(context, this); } public ListViewSubClass(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public void setOnDeleteListener(OnDeleteListener onDeleteListener){ mDeleteListener=onDeleteListener; } //定义一个接口 public interface OnDeleteListener { void onDelete(int index); } //------>以下方法为OnTouchListener接口的实现 @Override public boolean onTouch(View v, MotionEvent event) { //if-->当有删除View的时候.我们触摸该ListView时将其消失 if (isDeleteShowing) { mListViewItemViewGroup.removeView(mDeleteView); mDeleteView = null; isDeleteShowing = false; return false; //else-->其余时候交给GestureDetector处理 } else { return mGestureDetector.onTouchEvent(event); } } //------>以下方法为OnTouchListener接口的实现 //------>以下方法为OnGestureListener接口的实现 @Override public boolean onDown(MotionEvent e) { if (!isDeleteShowing) { selectedItem = pointToPosition((int) e.getX(), (int) e.getY()); } return false; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) { //当删除View没有显示并且是水平滑动时我们显示删除View if (!isDeleteShowing && Math.abs(velocityX) > Math.abs(velocityY)) { mDeleteView = LayoutInflater.from(getContext()).inflate(R.layout.delete, null); mDeleteView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mListViewItemViewGroup.removeView(mDeleteView); mDeleteView = null; isDeleteShowing = false; mDeleteListener.onDelete(selectedItem); } }); //找到当前的Item mListViewItemViewGroup = (ViewGroup) getChildAt(selectedItem-getFirstVisiblePosition()); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); params.addRule(RelativeLayout.CENTER_VERTICAL); mListViewItemViewGroup.addView(mDeleteView, params); isDeleteShowing = true; } return false; } @Override public void onLongPress(MotionEvent e) { } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,float distanceY) { return false; } @Override public void onShowPress(MotionEvent e) { } @Override public boolean onSingleTapUp(MotionEvent e) { return false; } //------>以上方法为OnGestureListener接口的实现}
main.xml如下:
delete.xml如下:
listviewitem如下:
转载地址:https://it9527.blog.csdn.net/article/details/18913317 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2024年04月25日 02时44分58秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
对 && 和 || 这两个逻辑运算符进行一个深入的理解
2019-04-30
margin塌陷 和 margin合并 两个BUG
2019-04-30
javascript:null undefined 和 NaN 的区别
2019-04-30
javascript之 var,let, const之间的异同
2019-04-30
Impala查询卡顿分析案例
2019-04-30
如何对CDH集群中的Impala打印线程堆栈
2019-04-30
Impala元数据简介
2019-04-30
Impala关于ValueTransferGraph一段代码的疑问解答
2019-04-30
Impala元数据缓存的生命周期
2019-04-30
记一次曲折的Debug经历
2019-04-30
Impala支持Google云存储开发笔记
2019-04-30
如何在Apache JIRA中搜索issue
2019-04-30
Impala-shell相关源码笔记
2019-04-30
Windows下配置Storm源码阅读环境(vim+ctags)
2019-04-30
Storm源码细读——Nimbus启动
2019-04-30
Storm源码细读——Supervisor启动
2019-04-30
scrapy 排错记录
2019-04-30
Titan线程隔离的验证
2019-04-30