Android 开源项目浅读-------SwipeMenuListView-重写,第四章,修改适配器
来源:互联网 发布:开票软件金税盘版升级 编辑:程序博客网 时间:2024/05/22 08:36
为了后续代码更少的更改,我们先把数据源给配置好。前面的文章都是采用虚拟数据源来实现的。首先我们要将用户的数据传入Adapter里面,通过修改BaseAdapter的基类实现。
class AppAdapter extends BaseAdapter{ @Override public int getCount() { return mAppList.size(); } @Override public ApplicationInfo getItem(int position) { return mAppList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { convertView = View.inflate(getApplicationContext(),R.layout.item,null); ApplicationInfo applicationInfo = getItem(position); ImageView imageView = (ImageView)convertView.findViewById(R.id.imageView); imageView.setImageDrawable(applicationInfo.loadIcon(getPackageManager())); TextView textView = (TextView)convertView.findViewById(R.id.textView); textView.setText(applicationInfo.loadLabel(getPackageManager())); return convertView; } }
第一处修改时getCount,返回的是我们用户数据列表的长度,第二处,是getItem返回应用信息。第三处是getView定义了一个item的xml文件用来显示应用的图标和名字。
我们改完了这个Adapter,在就是修改SwipeMenuAdapter的getview方法,将这个布局传递给SwipeMenuLayout
@Override public View getView(int position, View convertView, ViewGroup parent) { // convertView = View.inflate() convertView =mListAdapter.getView(position,convertView,parent); SwipeMenu menu = new SwipeMenu(convertView.getContext()); createMenu(menu); SwipeMenuView menuView = new SwipeMenuView((MySwipeMenuListView)parent, menu); SwipeMenuLayout swipeMenuLayout = new SwipeMenuLayout(convertView, menuView); Log.i(TAG,"the current item number id is " +num); num++; return swipeMenuLayout; }
我们把convertview传递给了swipeMenuLayout了。另外传递一个是menuView对象,待会再谈。
这样我们修改一下SwipeMenuLayout的代码,将这个item的布局显示出来。
构造函数传入
public SwipeMenuLayout(View view, SwipeMenuView menuView) { super(view.getContext()); mContentView = view; mMenuView = menuView; init(view.getContext()); }
初始化函数add进去
void init(Context context){ setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); this.addView(mMenuView); this.addView(mContentView); }
然后在layout函数里面画出来
@Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); mContentView.layout(0,0,getMeasuredWidth(), mContentView.getMeasuredHeight()); // mMenuView.layout(600, 0 , right, bottom); Log.i(TAG, "the top position of current item is " + top); }
效果如图
我们看到已经成功的将数据源加入进来了。可是每一行的菜单没有了。该开源项目实现了自定义菜单,所有我们参考将菜单分离出来,作为参数传入到SwipeMenuLayout里面来。
由于要自定义菜单,所以每一项就有很多属性,定义一个类来封装这些属性,那就是SwipeMenuItem
package io.github.nianhua110.myswipemenulistview;import android.content.Context;import android.graphics.drawable.Drawable;/** * Created by kankan on 2016/5/12. */public class SwipeMenuItem { public SwipeMenuItem(Context mContext) { this.mContext = mContext; } public int getId() { return id; } public void setId(int id) { this.id = id; } public Context getmContext() { return mContext; } public void setmContext(Context mContext) { this.mContext = mContext; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public Drawable getIcon() { return icon; } public void setIcon(Drawable icon) { this.icon = icon; } public Drawable getBackground() { return background; } public void setBackground(Drawable background) { this.background = background; } public int getTitleColor() { return titleColor; } public void setTitleColor(int titleColor) { this.titleColor = titleColor; } public int getTitleSize() { return titleSize; } public void setTitleSize(int titleSize) { this.titleSize = titleSize; } public int getWidth() { return width; } public void setWidth(int width) { this.width = width; } private int id; private Context mContext; private String title; private Drawable icon; private Drawable background; private int titleColor; private int titleSize; private int width;}
这就是个数据类,仅有些getter 和 setter方法。
那么我们在定义一个菜单类存放菜单的每一项和一些其他的属性
package io.github.nianhua110.myswipemenulistview;import android.content.Context;import android.view.MenuItem;import java.util.ArrayList;import java.util.List;/** * Created by kankan on 2016/5/14. */public class SwipeMenu { List<SwipeMenuItem> mItems; Context mContex; public SwipeMenu(Context mContex) { this.mContex = mContex; mItems = new ArrayList<>(); } public List<SwipeMenuItem> getmItems() { return mItems; } public void addMenuItem(SwipeMenuItem item){ mItems.add(item); } public void removeItem(SwipeMenuItem item){ mItems.remove(item); } public SwipeMenuItem getMenuItem(int position){ return mItems.get(position); }}
菜单的数据有了,就需要一个类来画菜单了 ,那就是SwipeMenuView。我们更改这个类。
/** * Created by kankan on 2016/5/14. */public class SwipeMenuView extends LinearLayout { public SwipeMenuView(Context context) { super(context); init(context); } public SwipeMenuView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public SwipeMenuView(MySwipeMenuListView view, SwipeMenu menu){ super(view.getContext()); init(view.getContext()); } void init(Context context){ LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); setOrientation(HORIZONTAL); setLayoutParams(layoutParams); TextView textView = new TextView(context); textView.setText("hello"); textView.setTextColor(Color.RED); ImageView imageView = new ImageView(context); imageView.setImageResource(R.mipmap.ic_launcher); addView(textView); addView(imageView); }}
这个类已经实现过,这次简单修改一下,添加一个新的构造函数,将SwipeMenu注入就行了。后续修改下面的章节在说。
这样我们修改完了。我们将这个显示类SwipeMenuView对象 注入到SwipeMenuLayout里面显示,注入方式和刚才的Itemview相似,在SwipeMenuAdapter的构造函数里注入
@Override public View getView(int position, View convertView, ViewGroup parent) { // convertView = View.inflate() convertView =mListAdapter.getView(position,convertView,parent); SwipeMenu menu = new SwipeMenu(convertView.getContext()); createMenu(menu); SwipeMenuView menuView = new SwipeMenuView((MySwipeMenuListView)parent, menu); SwipeMenuLayout swipeMenuLayout = new SwipeMenuLayout(convertView, menuView); Log.i(TAG,"the current item number id is " +num); num++; return swipeMenuLayout; } public void createMenu(SwipeMenu menu) { // Test Code SwipeMenuItem item = new SwipeMenuItem(mContext); item.setTitle("Item 1"); item.setBackground(new ColorDrawable(Color.GRAY)); item.setWidth(300); menu.addMenuItem(item); item = new SwipeMenuItem(mContext); item.setTitle("Item 2"); item.setBackground(new ColorDrawable(Color.RED)); item.setWidth(300); menu.addMenuItem(item); }
可以看出在createMenu里面添加了两个菜单项目。
最后注入到SwipeMenuLayout里面
构造函数
public SwipeMenuLayout(View view, SwipeMenuView menuView) { super(view.getContext()); mContentView = view; mMenuView = menuView; init(view.getContext()); }
初始化
void init(Context context){ setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); this.addView(mMenuView); this.addView(mContentView);}
最后layout
<pre class="java" name="code">@Overrideprotected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); mContentView.layout(0,0,getMeasuredWidth(), mContentView.getMeasuredHeight()); mMenuView.layout(600, 0 , right, bottom); Log.i(TAG, "the top position of current item is " + top);}
最终效果图:
本章节最后,咱们把自定义菜单功能的显示部分实现了。其实主要修改一下SwipeMenuView类就好了。把传进来的每个Item给Layout出来就行了,很简单直接上源码吧。
import java.util.List;/** * Created by kankan on 2016/5/14. */public class SwipeMenuView extends LinearLayout { private SwipeMenu mMenu; private MySwipeMenuListView mListView ; public SwipeMenuView(Context context) { super(context); init(context); } public SwipeMenuView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public SwipeMenuView(MySwipeMenuListView view, SwipeMenu menu){ super(view.getContext()); mListView = view; mMenu = menu; List<SwipeMenuItem> items = menu.getMenuItems(); int id = 0; for (SwipeMenuItem item : items) { addItem(item, id++); } // init(view.getContext()); } void init(Context context){ LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); setOrientation(HORIZONTAL); setLayoutParams(layoutParams); TextView textView = new TextView(context); textView.setText("hello"); textView.setTextColor(Color.RED); ImageView imageView = new ImageView(context); imageView.setImageResource(R.mipmap.ic_launcher); } private void addItem(SwipeMenuItem item, int id) { LayoutParams params = new LayoutParams(item.getWidth(), LayoutParams.MATCH_PARENT); LinearLayout parent = new LinearLayout(getContext()); parent.setId(id); parent.setGravity(Gravity.CENTER); parent.setOrientation(LinearLayout.VERTICAL); parent.setLayoutParams(params); parent.setBackgroundDrawable(item.getBackground()); // parent.setOnClickListener(this); addView(parent); if (item.getIcon() != null) { parent.addView(createIcon(item)); } if (!TextUtils.isEmpty(item.getTitle())) { parent.addView(createTitle(item)); } } private ImageView createIcon(SwipeMenuItem item) { ImageView iv = new ImageView(getContext()); iv.setImageDrawable(item.getIcon()); return iv; } private TextView createTitle(SwipeMenuItem item) { TextView tv = new TextView(getContext()); tv.setText(item.getTitle()); tv.setGravity(Gravity.CENTER); tv.setTextSize(item.getTitleSize()); tv.setTextColor(item.getTitleColor()); return tv; }}
将是将SwipeMenuItem里面的属性给实现了。最终效果图如下。
- Android 开源项目浅读-------SwipeMenuListView-重写,第四章,修改适配器
- Android 开源项目浅读-------SwipeMenuListView-重写-第二章,菜单显示
- Android 开源项目浅读-------SwipeMenuListView-重写,第三章,随手指移动的菜单
- Android 开源项目浅读-------SwipeMenuListView-重写,第五章,滑动弹出,放手关闭功能实现
- Android 开源项目浅读-------SwipeMenuListView-重写,第六章,缓慢收回
- Android 开源项目浅读-------SwipeMenuListView-重写,第七章,菜单停留和暂停响应
- Android 开源项目浅读-------SwipeMenuListView-重写,八章,菜单响应
- Android 开源项目浅读-------SwipeMenuListView-重写-第一章-手指移动事件捕获
- Android 开源项目浅读-------SwipeMenuListView
- 开源项目SwipeMenuListView使用
- 开源项目SwipeMenuListView学习笔记
- Android仿qq下拉刷新及向左滑动列表----PullToRefresh, SwipeMenuListView开源项目整合
- Android仿qq下拉刷新及向左滑动列表----PullToRefresh, SwipeMenuListView开源项目整合
- Android仿qq下拉刷新及向左滑动列表----PullToRefresh, SwipeMenuListView开源项目整合
- 关于开源项目SwipeMenuListView的使用详解
- android重写适配器
- Android可左右滑动的ListView开源框架SwipeMenuListView
- Android SwipeMenuListView
- HttpServletRequest获取URL get变量
- PHP基础教程3
- weak和assign的区别
- Things You Should Never Do, Part I
- Avalanche:quand la neige devient dangereuse?
- Android 开源项目浅读-------SwipeMenuListView-重写,第四章,修改适配器
- 系统属性调用评估方法介绍
- xss攻击入门详情
- 107[Leetcode].Binary Tree Level Order Traversal II
- iOS开发之关于Socket通讯方式
- (三) 开始进行Windows应用程序的用户界面开发
- 汽车销售发票扫描识别系统助力汽车业
- C++static关键字
- Emacs Python completer