Android实现可复用的选择页面

本文实例为大家分享了Android实现可复用的选择页面的具体代码,供大家参考,具体内容如下

窗口代码

/**
 * 根据上一个页面传过来的isMultipleEnable判断是否可以多选
 * 1.单选页面选中一个条目直接结束并回传
 * 2.多选页面选中之后需要提交
 * 3.提交数据之后需要刷新列表
 */
public class UserSelectActivity extends AppCompatActivity implements View.OnClickListener {

  private static final String TAG = "UserSelectActivity";

  @BindView(R.id.tv_title_middle)
  TextView title;
  @BindView(R.id.title_left)
  ImageView back;
  @BindView(R.id.normal_user_listview)
  ListView mListView;
  @BindView(R.id.edit_tv)
  TextView edit;
  @BindView(R.id.filter_tv)
  TextView filter;

  private Context mContext;
  private boolean isMultipleEnable;
  private UserSelectAdapter mAdapter;
  private List<ClsNormalUser> mClsNormalUserList;

  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_normal_user_list);
    //初始化ButterKnife
    ButterKnife.bind(this);

    initView();
    initData();
    initListener();
  }

  private void initData() {
    mContext = this;

    //通过源页面传过来的值来生成对应的视图,默认是单选
    isMultipleEnable = getIntent().getBooleanExtra("isMultipleEnable", false);

    //初始化数据源
    mClsNormalUserList = new ArrayList<>();
    mAdapter = new UserSelectAdapter(mClsNormalUserList, mContext);
    mListView.setAdapter(mAdapter);

    getOfflineData(20);

    //多选页面要显示提交按钮和checkbox
    if (isMultipleEnable) {
      edit.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_send_black_24dp, 0, 0, 0);
      edit.setVisibility(View.VISIBLE);

      for (ClsNormalUser user : mClsNormalUserList) {
        user.setIsCheckBoxVisible(true);
      }
    }
  }

  //生成模拟数据
  private void getOfflineData(int num) {
    List<ClsNormalUser> clsNormalUserList = new ArrayList<>();
    for (int i = 0; i < num; i++) {
      ClsNormalUser clsNormalUser = new ClsNormalUser();
      clsNormalUser.setUserID("userID " + i);
      clsNormalUser.setWorkNumber("workNumber " + i);
      clsNormalUser.setUserType("userType " + i);
      clsNormalUser.setOrgName("orgName " + i);
      clsNormalUser.setCName("cName " + i);
      clsNormalUser.setSysUserName("sysUserName " + i);
      clsNormalUser.setOrgID("orgID " + i);
      clsNormalUser.setWorkPos("workPos " + i);
      clsNormalUserList.add(clsNormalUser);
    }
    //数据填充后要同时适配器刷新视图
    mClsNormalUserList.addAll(clsNormalUserList);
    mAdapter.notifyDataSetChanged();
  }

  private void initView() {
    title.setText("选择用户");
  }

  private void initListener() {
    edit.setOnClickListener(this);

    mListView.setOnItemClickListener((parent, view, position, id) -> {
      ClsNormalUser clsNormalUser = mClsNormalUserList.get(position);
      if (isMultipleEnable) {
        //多选状态下点击选中当前条目
        if (clsNormalUser.getIsCheckBoxVisible()) {
          clsNormalUser.setIsChecked(!clsNormalUser.getIsChecked());
          mAdapter.notifyDataSetChanged();
        }
      } else {
        //单选状态下点击结束当前页并回传值
        Intent intent = new Intent();
        //实体类要实现序列化接口Parcelable
        intent.putExtra("user", clsNormalUser);
        setResult(RESULT_OK, intent);
        finish();
      }
    });
  }

  @Override
  public void onClick(View v) {

    //点击提交按钮将选中的值回传并结束当前页
    if (v.getId() == R.id.edit_tv) {
      ArrayList<ClsNormalUser> normalUserList = new ArrayList<>();
      for (ClsNormalUser normalUser : mClsNormalUserList) {
        if (normalUser.getIsChecked()) {
          normalUserList.add(normalUser);
        }
      }
      Intent intent = new Intent();
      //实体类要实现序列化接口Parcelable
      intent.putParcelableArrayListExtra("users", normalUserList);
      setResult(RESULT_OK, intent);
      finish();
    }
  }
}

适配器代码

public class UserSelectAdapter extends BaseAdapter {

  private List<ClsNormalUser> mList;
  private LayoutInflater mInflater;

  public UserSelectAdapter(List<ClsNormalUser> list, Context mContext) {
    mList = list;
    mInflater = LayoutInflater.from(mContext);
  }

  @Override
  public int getCount() {
    return mList.size();
  }

  @Override
  public ClsNormalUser getItem(int position) {
    return mList.get(position);
  }

  @Override
  public long getItemId(int position) {
    return position;
  }

  @Override
  public View getView(final int position, View convertView, ViewGroup root) {
    ItemHolder holder;
    ClsNormalUser clsNormalUser = mList.get(position);

    if (convertView == null) {
      convertView = mInflater.inflate(R.layout.item_alluser_sys, null);
      holder = new ItemHolder();
      holder.id = convertView.findViewById(R.id.user_id);
      holder.name = convertView.findViewById(R.id.user_name);
      holder.org = convertView.findViewById(R.id.user_org);

      holder.checkBox = convertView.findViewById(R.id.user_checkbox);
      convertView.setTag(holder);
    } else {
      holder = (ItemHolder) convertView.getTag();
    }

    holder.id.setText(clsNormalUser.getUserID());
    holder.name.setText(clsNormalUser.getCName());
    holder.org.setText(clsNormalUser.getOrgName());

    //是否显示checkbox
    if (clsNormalUser.getIsCheckBoxVisible()) {
      holder.checkBox.setVisibility(View.VISIBLE);
    } else {
      holder.checkBox.setVisibility(View.GONE);
    }

    //条目是否选中
    if (clsNormalUser.getIsChecked()) {
      holder.checkBox.setImageResource(R.drawable.ic_check_box_black_24dp);
    } else {
      holder.checkBox.setImageResource(R.drawable.ic_check_box_outline_blank_black_24dp);
    }

    return convertView;
  }

  class ItemHolder {
    TextView id;
    TextView name;
    TextView org;
    ImageView checkBox;
  }
}

效果如图

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android PickerView滚动选择器的使用方法

    手机里设置闹钟需要选择时间,那个选择时间的控件就是滚动选择器,前几天用手机刷了MIUI,发现自带的那个时间选择器效果挺好看的,于是就自己仿写了一个,权当练手.先来看效果: 效果还行吧?实现思路就是自定义一个PickerView,单独滚动的是一个PickerView,显然上图中有分和秒的选择所以在布局里用了两个PickerView.由于这里不涉及到text的点击事件,所以只需要继承View就行了,直接把text用canvas画上去.PickerView的实现的主要难点: 难点1: 字体随距离的渐变

  • 轻松实现Android仿淘宝地区选择功能

    最近用淘宝客户端的时候,编辑地址的时候有个地区选择的功能.看上面的效果觉得挺酷,滚动的时候,是最后一个从下面飞上来挨着前一个.就自己鼓捣一个出来玩玩. 说了效果可能不太直观,下面上两张图看看效果 淘宝地区选择效果 再来一张自己的效果 gif的效果可能不太好,大家自己用Android手机打开淘宝看看 实现分析 展示很简单,ListView就可以了.对于动画效果,只需要在getView的时候获取到要展示的View,通过属性动画修改translationY就ok啦.由于地区选择是一个界面,所以这里还用

  • Android 文件选择的实现代码

    打开文件选择器 复制代码 代码如下: private void showFileChooser() {    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);     intent.setType("*/*");     intent.addCategory(Intent.CATEGORY_OPENABLE); try {        startActivityForResult( Intent.createChooser(

  • Android实现可复用的选择页面

    本文实例为大家分享了Android实现可复用的选择页面的具体代码,供大家参考,具体内容如下 窗口代码 /** * 根据上一个页面传过来的isMultipleEnable判断是否可以多选 * 1.单选页面选中一个条目直接结束并回传 * 2.多选页面选中之后需要提交 * 3.提交数据之后需要刷新列表 */ public class UserSelectActivity extends AppCompatActivity implements View.OnClickListener { privat

  • Android实现可复用的筛选页面

    本文实例为大家分享了Android实现可复用的筛选页面的具体代码,供大家参考,具体内容如下 窗口代码 /** * 筛选页面 * 1.将用户的输入转换成sql语句 * 2.涉及到精确查询和模糊查询 * 3.提交数据之后需要刷新列表 */ public class UserFilterActivity extends AppCompatActivity implements View.OnClickListener { private List<ImageView> imageViewList;

  • Android WebView自定义长按选择实现收藏/分享选中文本功能

    效果图(1.3M) 一.前言 ** 戳这里可以去DEMO,来吧 ** 相信刚接触android不久的同志们,在面对产品提出的 : "自定义WebView页面中,长按文本的弹出选项.点击选择后,分享.转发.收藏选择文本" 这样的需求时,第一反应大部分是:这是系统行为,如果实现需要在web端实现. 但是web端实现的局限性太大,曾经也有过监听系统粘贴板,在用户点击复制的时候实现其他的逻辑,但是这样用户体验不好,所以自定义WebView中长按的弹出菜单,并在点击时返回选中文本的小控件闪亮登场

  • 探究Android中ListView复用导致布局错乱的解决方案

    首先来说一下具体的需求是什么样的: 需求如图所示,这里面有ABCD四个选项的题目,当点击A选项,如果A是正确的答案,则变成对勾的图案,如果是错误答案,则变成错误的图案,这里当时在写的时候觉得很简单,只要是在点击的时候判断我点击的选项与正确答案是否一样,是一样就将图片换成正确的样式,如果不一样就换成错误的样式,于是我便写了下面的代码(只贴出了核心Adapter中的代码) package com.fizzer.anbangproject_dahuo_test.Adapter; import andr

  • Android自定义view实现滚动选择控件详解

    目录 前言 需求 编写代码 主要问题 前言 上篇文章通过一个有header和footer的滚动控件(Viewgroup)学了下MeasureSpec.onMeasure以及onLayout,接下来就用一个滚动选择的控件(View)来学一下onDraw的使用,并且了解下在XML自定义控件参数. 需求 这里就是一个滚动选择文字的控件,还是挺常见的,之前用别人的,现在选择手撕一个,核心思想如下: 1.有三层不同大小及透明度的选项,选中项放在中间 2.接受一个列表的数据,静态时显示三个值,滚动时显示四个

  • Android 高仿微信语音聊天页面高斯模糊(毛玻璃效果)

    目前的应用市场上,使用毛玻璃效果的APP随处可见,比如用过微信语音聊天的人可以发现,语音聊天页面就使用了高斯模糊效果. 先看下效果图: 仔细观察上图,我们可以发现,背景图以用户头像为模板,对其进行了高斯模糊,并把它作为整个页面的背景色. 关于Android如何快速实现高斯模糊(毛玻璃效果),网上一堆相关介绍,可参考下面文章一种快速毛玻璃虚化效果实现–Android. 下面直接给出模糊化工具类(已验证可行): import android.graphics.Bitmap; /** * 快速模糊化工

  • 灵活使用Android中ActionBar和ViewPager切换页面

    本文实例讲述了Android使用ActionBar和ViewPager切换页面,分享给大家供大家参考.具体如下: 运行效果截图如下: 项目布局如下: 具体代码如下: MainActivity.java代码 import java.util.ArrayList; import java.util.List; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.

  • Android 中使用 ViewPager实现屏幕页面切换和页面轮播效果

    之前关于如何实现屏幕页面切换,写过一篇博文<Android中使用ViewFlipper实现屏幕切换>,相比ViewFlipper,ViewPager更适用复杂的视图切换,而且Viewpager有自己的adapter,这也让其适应复杂对象,实现数据的动态加载. ViewPager是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api.而viewpager就是其中之一,利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等. 下面我们就展示下Vie

  • Android Activity中使用Intent实现页面跳转与参数传递的方法

    本文实例讲述了Android Activity中使用Intent实现页面跳转与参数传递的方法.分享给大家供大家参考,具体如下: 新建一个FirstAvtivity.java package com.zhuguangwei; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.O

  • android打开应用所在的市场页面进行评分操作的方法

    本文实例讲述了android打开应用所在的市场页面进行评分操作的方法.分享给大家供大家参考.具体实现方法如下: String mAddress = "market://details?id=" + getPackageName(); Intent marketIntent = new Intent("android.intent.action.VIEW"); marketIntent .setData(Uri.parse(mAddress )); startActi

随机推荐