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里面的属性给实现了。最终效果图如下。


点击下载
0 0