Android实现多级列表中的新建功能

本文实例为大家分享了Android实现多级列表中的新建功能,供大家参考,具体内容如下

多级列表的页面实现比较简单,所以把新建的功能拿出来了。

窗口代码

/**
 * 新建一个第一级列表的条目
 * 1.选择图片和附件都用Intent.ACTION_GET_CONTENT实现
 * 2.打开文件用Intent.ACTION_VIEW实现
 * 3.回传的URI需要转化成真实路径
 * 4.提交数据之后需要刷新列表
 */

public class SectionNewActivity extends AppCompatActivity implements View.OnClickListener {
 private static final String TAG = "SectionNewActivity";
 @BindView(R.id.tv_title_middle)
 TextView title;
 @BindView(R.id.title_left)
 ImageView back;
 @BindView(R.id.edit_tv)
 TextView edit;
 @BindView(R.id.filter_tv)
 TextView filter;
 @BindView(R.id.section_new_logo)
 ImageView sectionLogo;
 @BindView(R.id.section_new_manager)
 TextView sectionManager;
 @BindView(R.id.section_new_title)
 TextView sectionTitle;
 @BindView(R.id.section_new_desc)
 TextView sectionDesc;
 @BindView(R.id.tv_upload_attach)
 TextView selectAttach;
 @BindView(R.id.lv_attach)
 ListView mListView;

 private Context mContext;
 private List<ClsAttachMent> mAttachList;
 private AttachmentListAdapter mAdapter;

 @Override
 protected void onCreate(@Nullable Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_section_new);
  ButterKnife.bind(this);

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

 private void initData() {
  mContext = this;

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

 private void initView() {
  title.setText("新建板块");

  edit.setVisibility(View.VISIBLE);
  edit.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_send_black_24dp, 0, 0, 0);
 }

 private void initListener() {

  back.setOnClickListener(this);
  edit.setOnClickListener(this);
  filter.setOnClickListener(this);
  sectionLogo.setOnClickListener(this);
  sectionManager.setOnClickListener(this);
  selectAttach.setOnClickListener(this);

  //点击附件列表条目的删除按钮,删除对应附件
  mAdapter.setmCallback((view, position) -> {
   mAttachList.remove(position);
   mAdapter.notifyDataSetChanged();
  });

  //点击附件列表弹出打开方式
  mListView.setOnItemClickListener((parent, view, position, id) -> {

   ClsAttachMent clsAttachMent = mAttachList.get(position);
   Intent intent = new Intent();
   intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   intent.setAction(Intent.ACTION_VIEW);

   intent.setDataAndType(Uri.parse(clsAttachMent.getUri()), "*/*");
   startActivity(intent);
  });
 }

 @Override
 public void onClick(View v) {

  if (v.getId() == R.id.title_left) {
   finish();
  }
  if (v.getId() == R.id.edit_tv) {
   submit();
  }
  if (v.getId() == R.id.section_new_logo) {
   //打开手机原生的文件管理器,并且选取内容
   Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
   intent.addCategory(Intent.CATEGORY_OPENABLE);
   //文件类型为图片
   intent.setType("image/*");
   startActivityForResult(intent, 16352);
  }
  if (v.getId() == R.id.section_new_manager) {
   Intent intent = new Intent(mContext, UserSelectActivity.class);
   startActivityForResult(intent, 12345);
  }

  if (v.getId() == R.id.tv_upload_attach) {

   //上传的附件数量不能超过4个
   if (mAttachList.size() < 4) {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setType("*/*");
    startActivityForResult(intent, 12367);

    if (mAttachList.size() == 0) {
     Toast.makeText(mContext, R.string.upload_warning, Toast.LENGTH_LONG).show();
    }

   } else {
    Toast.makeText(mContext, "附件数量已达上限!", Toast.LENGTH_SHORT).show();
   }
  }
 }

 private void submit() {
  Toast.makeText(mContext, "在此处调用接口!", Toast.LENGTH_SHORT).show();
  finish();
 }

 @Override
 //requestCode要对应上,resultCode都为默认值RESULT_OK
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {

  //选择图片完成之后使用glide加载到控件上,此处有时需要把图片上传给后台
  //提交数据的时候传图片在后台的路径
  if (requestCode == 16352 && resultCode == RESULT_OK) {
   Glide.with(mContext).load(data.getData()).into(sectionLogo);
  }

  //打开选择用户的页面,根据传的参数不同页面也不同,默认是单选页面
  if (requestCode == 12345 && resultCode == RESULT_OK) {
   ClsNormalUser user = data.getParcelableExtra("user");
   sectionManager.setText(user.getCName());
  }

  //遍历已经上传的附件列表,如果已经存在就弹出提示
  if (requestCode == 12367 && resultCode == RESULT_OK) {
   String uri = data.getData().toString();

   if (mAttachList.size() > 0) {
    for (int i = 0; i < mAttachList.size(); i++) {
     if (uri.equals(mAttachList.get(i).getUri())) {
      Toast.makeText(mContext, "请选择不同文件!", Toast.LENGTH_SHORT).show();
      break;
     }
     if (i == mAttachList.size() - 1) {
      addAttach(data);
      break;
     }
    }
   } else {
    addAttach(data);
   }
  }

  super.onActivityResult(requestCode, resultCode, data);
 }

 private void addAttach(Intent data) {
  //这里使用第三方库ucrop的getPath方法,也可以自己实现uri转换为path
  File file = new File(getPath(mContext, data.getData()));

  ClsAttachMent clsAttachMent = new ClsAttachMent();
  String name = file.getName();
  String type = name.split("\\.")[1];
  String size = file.length() + "";
  clsAttachMent.setSize(size);
  clsAttachMent.setFilename(name);
  clsAttachMent.setUri(data.getData().toString());

  //这里需要调用上传接口
  uploadFile(file.getPath());

  mAttachList.add(clsAttachMent);
  mAdapter.notifyDataSetChanged();
 }

 private void uploadFile(String path) {
  Toast.makeText(mContext, "在此处调用接口!", Toast.LENGTH_SHORT).show();
 }
}

布局文件代码

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:background="@color/ghostwhite"
 android:layout_height="match_parent">

 <LinearLayout
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:orientation="vertical">

  <include layout="@layout/title_bar" />

  <ImageView
   android:id="@+id/section_new_logo"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_gravity="center"
   android:scaleType="centerCrop"
   android:background="@color/white"
   android:src="@drawable/logo" />

  <include layout="@layout/layout_item_divider_horizontal" />

  <EditText
   android:id="@+id/section_new_title"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_margin="10dp"
   android:background="@null"
   android:hint="请输入名称"
   android:inputType="text"
   android:textColor="@color/black" />

  <include layout="@layout/layout_item_divider_horizontal" />

  <EditText
   android:id="@+id/section_new_desc"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_margin="10dp"
   android:background="@null"
   android:gravity="top|start"
   android:hint="请输入内容"
   android:inputType="textMultiLine"
   android:minHeight="100dp"
   android:textColor="@color/black" />

  <include layout="@layout/layout_item_divider_horizontal" />

  <LinearLayout
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_margin="10dp"
   android:orientation="horizontal">

   <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="选择版主:"
    android:textColor="@color/black"
    android:textSize="18sp" />

   <TextView
    android:id="@+id/section_new_manager"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:drawableEnd="@drawable/ic_arrow_drop_down_black_24dp"
    android:text="default user"
    android:textColor="@color/black"
    android:textSize="18sp" />
  </LinearLayout>

  <include layout="@layout/layout_item_divider_horizontal" />

  <LinearLayout
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:gravity="center_vertical"
   android:background="@color/white"
   android:orientation="horizontal">

   <TextView
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="20dp"
    android:gravity="center_vertical"
    android:minHeight="30dp"
    android:text="文件名:"
    android:textColor="@color/black" />

   <TextView
    android:layout_width="100dp"
    android:layout_height="30dp"
    android:gravity="center_vertical"
    android:text="文件大小:"
    android:textColor="@color/black" />

   <TextView
    android:layout_width="wrap_content"
    android:layout_height="30dp"
    android:gravity="center_vertical"
    android:text="操作:"
    android:textColor="@color/black" />

  </LinearLayout>

  <ListView
   android:id="@+id/lv_attach"
   android:layout_width="match_parent"
   android:layout_height="160dp"
   android:divider="@null" />

  <include layout="@layout/layout_item_divider_horizontal" />

  <TextView
   android:id="@+id/tv_upload_attach"
   style="@style/Widget.AppCompat.Button"
   android:layout_width="wrap_content"
   android:layout_height="40dp"
   android:layout_gravity="end"
   android:text="添加附件"
   android:textColor="@color/black"
   android:textSize="16sp" />
 </LinearLayout>
</ScrollView>

适配器代码

public class AttachmentListAdapter extends BaseAdapter {

 private List<ClsAttachMent> mList;
 private LayoutInflater mInflater;
 private Callback mCallback;

 //自定义回调接口,用于传值
 public interface Callback {

  void onClick(View view, int position);
 }

 public AttachmentListAdapter(List<ClsAttachMent> attachments, Context mContext) {
  this.mList = attachments;
  mInflater = LayoutInflater.from(mContext);
 }

 public void setmCallback(Callback mCallback) {
  this.mCallback = mCallback;
 }

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

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

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

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {

  ClsAttachMent clsAttachMent = mList.get(position);
  ViewHolder holder;

  if (convertView == null) {
   holder = new ViewHolder();
   convertView = mInflater.inflate(R.layout.item_attchment_list, null);
   holder.delete = convertView.findViewById(R.id.attachment_delete);
   holder.name = convertView.findViewById(R.id.attachment_name);
   holder.size = convertView.findViewById(R.id.attachment_size);

   convertView.setTag(holder);
  } else {
   holder = (ViewHolder) convertView.getTag();
  }

  holder.name.setText(clsAttachMent.getFilename());
  long length = Long.parseLong(clsAttachMent.getSize());
  holder.size.setText(length / 1024 + "KB");

  //将position放在tag里面
  holder.delete.setTag(position);

  holder.delete.setOnClickListener(v -> {
   //触发点击事件的时候将position回传
   mCallback.onClick(v, (Integer) v.getTag());
  });
  return convertView;
 }

 private class ViewHolder {

  TextView name;
  TextView size;
  TextView delete;
 }
}

效果如图:

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

(0)

相关推荐

  • Android仿美团淘宝实现多级下拉列表菜单功能

    我们在常用的电商或者旅游APP中,例如美团,手机淘宝等等,都能够看的到有那种下拉式的二级列表菜单.具体如图所示: 上面两张图就是美团的一个二级列表菜单的一个展示.我相信很多人都想开发一个跟它一样的功能放到自己的APP中.好,接下来我们就开始动手,解决它. 1.结构分析 首先,我们给出这个下拉菜单需要的组建.我们用线框图来分析. 1)如上图所示,最外围的是一个Activity,顶部包含了一个View的容器,这个容器主要是装载ToggleButton来实现诸如美团里面的"美食,全城,理我最近,刷选&

  • Android 绘制多级树形选择列表实例代码

    一.概述 前段时间有个项目的需要在Android端显示一个复选的多层树形控件,主要展示一个公司的组织架构,类似总部下面有各个部门,部门之下是组和员工等.另外需要加上展开与回收部门详情.关闭部分已开展的布局.勾选等功能. 效果图如下: 二.思路分析 毫无疑问,对于这种数据可能达到几千几万行的列表视图,我们需要选择recyclerview等具有回收item功能的控件,因此Item的状态保持放在Model中而不是View中. 由于原始数据是树形结构的,我们需要先将树形结构转换为列表数据,类似根结点 -

  • Android多级树形列表控件

    我们开发app过程中,经常会碰到需要 多级列表展示的效果.而Android原生sdk中根本没有3级 4级甚至更多级别的列表控件. 所以我们就要自己去实现一个类似treeListView 的控件,下面这个是我项目中的一个效果图,可支持多级列表扩展. android中有ExpandListView控件,但是这个控件只支持两级列表.对于多级列表如果重写这个不是很好用. 实现这种列表 思想就是递归,构造一个子父级的关系. 话不多说 代码中体会 Activity package com.example.c

  • Android中RecyclerView实现多级折叠列表效果(TreeRecyclerView)

    前言 首先不得不吐槽一下产品,尼玛为啥要搞这样的功能....搞个两级的不就好了嘛...自带控件,多好.三级,四级,听说还有六级的....这样丧心病狂的设计,后台也不好给数据吧. 先看看效果: 两级的效果: 三级的效果: 全部展开的效果(我只写了五级) 说说为什么写这货吧: 公司产品提出三级这个需求后,我就在网上找啊找. 找的第一个,发现实现其实是ExpandListview嵌套. 找的第二个,ExpandRecyclview,然后就用呗,发现三级展开很卡,看源码, 发现是RecyclerView

  • Android实现多级树形选择列表

    项目中有多个地方要用到多级列表的菜单,最开始我用的是ExpandableListView,但问题是ExpandableListView只支持两级列表,于是我就用ExpandableListView嵌套ExpandableListView,但非常麻烦,而且关键的是具体分几级是不确定的,也就是可能一级,可能多级,这要是五六级嵌套ListView,于是我就去学习鸿洋大神之前写的一篇关于实现Android多级树形列表的文章,实现很巧妙,使用一个ListView就可以实现多级列表效果,我做了部分修改,功能

  • Android UI 之实现多级树形列表TreeView示例

    所谓TreeView就是在Windows中常见的多级列表树,在Android中系统只默认提供了ListView和ExpandableListView两种列表,最多只支持到二级列表的实现,所以如果想要实现三级和更多层次的列表,就需要我们自己来做一些处理了. 其实这个效果很久以前就有人想办法实现了,但是实现的效果有一些问题,我的实现思路主要也是来自于网络,但是在其基础上修正了逻辑上的一些错误,做了一些优化. 先来看一下效果: 然后大体说一下思路: 其实这里实现的多级列表只是一个视觉效果,我们看到的分

  • Android中RecyclerView实现多级折叠列表效果(二)

    前言 在本文开始之前请大家先看一下这篇文章:http://www.jb51.net/article/113510.htm 上面的这篇文章是之前写的,里面发现有很多不好用地方,也学到些新姿势,改动了许多地方.下面来看看详细的介绍: 要点: 1.可以通过后台控制Item的展示. 2.TreeRecyclerAdapter,可以展开,折叠.多级展示 3.adapter可以使用装饰者模式进行扩展.支持EmptyAdapter.可以添加headview和footview 4.item的样式可以编写文档,t

  • Android实现多级列表中的新建功能

    本文实例为大家分享了Android实现多级列表中的新建功能,供大家参考,具体内容如下 多级列表的页面实现比较简单,所以把新建的功能拿出来了. 窗口代码 /** * 新建一个第一级列表的条目 * 1.选择图片和附件都用Intent.ACTION_GET_CONTENT实现 * 2.打开文件用Intent.ACTION_VIEW实现 * 3.回传的URI需要转化成真实路径 * 4.提交数据之后需要刷新列表 */ public class SectionNewActivity extends AppC

  • iOS多级列表实现代码

    在项目开发中,层级列表经常遇到,简单点的二级列表利用UITableView的Header就可以实现,再简单点的三级列表通过对Cell高度进行调整也可以实现三级列表的效果.但遇到多级列表,尤其是层次不明的动态列表就比较麻烦了. 原理 层级列表和树形结构比较类似,不过不是二叉树,而是多叉树.每个节点只需要拥有指向父节点和子节点的两个指针,就能形成一颗树.我们将多级列表中每一级对象看作一个node,node拥有两个属性,分别为父节点和子节点的ID. 每棵树有个一个虚拟的root节点,它的ID为root

  • Android开发中模仿qq列表信息滑动删除功能

    这个效果的完成主要分为两个部分 自定义view作为listview的列表项 一个view里面包括 显示头像,名字,消息内容等的contentView和滑动才能显示出来的删除,置顶的右边菜单menuView 在手指移动的时候同时改变这两个视图的位置 重写listview 判断item向左还是向右滑动 正常的滚动还是左右滑动等等 重写onTouchEvent 进行事件分发 大致思路: listview进行事件分发,判断需要滑动还是滚动等状态,如果需要滑动将事件传递给item进行滑动处理. 在item

  • Android实现从缓存中读取图片与异步加载功能类

    本文实例讲述了Android实现从缓存中读取图片与异步加载功能类.分享给大家供大家参考,具体如下: 在新浪微博的微博列表中的图片,为了加速其显示也为了加快程序的响应,可以参考该图片异步加载类实现. public class AsyncImageLoader { //SoftReference是软引用,是为了更好的为了系统回收变量 private HashMap<String, SoftReference<Drawable>> imageCache; public AsyncImag

  • Android基于BaseExpandableListAdapter实现的二级列表仿通话记录功能详解

    本文实例讲述了Android基于BaseExpandableListAdapter实现的二级列表仿通话记录功能.分享给大家供大家参考,具体如下: android SDK中带有这样类似的例子,但是那个还是静态数据,没有实际应用价值,参考意义不大. 网上找了很多,还是那样的情况,几乎是同一篇文章,大家转来转去.况且,那篇例子也是静态的数据. 还是自己试试,自己写一个吧.程序读取手机系统的通话记录,按联系人分组,显示到列表. 开发工具:eclipse 运行环境:htc G9 android2.3.3

  • Android实现软件列表的点击启动另外一个程序功能【附demo源码下载】

    本文实例讲述了Android实现软件列表的点击启动另外一个程序功能.分享给大家供大家参考,具体如下: 目前面世的许多软件中有这么一个功能:设备中安装了哪些软件,他们会以一个软件列表清单的形式向用户展示出来. 今天我们就来实现这一功能: 运行环境: motorola defy+ 系统2.3.6 主要 API : PackageInfo,PackageManager,LayoutInflater,ApplicationInfo PackageManger类,它的主要职责是管理应用程序包. 通过它,我

  • Android 实现WebView点击图片查看大图列表及图片保存功能

    在日常开发过程中,有时候会遇到需要在app中嵌入网页,此时使用WebView实现效果,但在默认情况下是无法点击图片查看大图的,更无法保存图片.本文将就这一系列问题的实现进行说明. 图示: 项目的知识点: 加载网页后如何捕捉网页中的图片点击事件: 获取点击的图片资源后进行图片显示,获取整个页面所有的图片: 支持查看上下一张的图片以及对图片缩放显示: 对图片进行保存: 其他:图片缓存的处理(不用每次都重新加载已查看过的图片) 项目代码结构: 前期准备(添加权限.依赖和混淆设置): 添加权限: <us

  • Android组件实现列表选择框功能

    android提供的列表选择框(Spinner)相当于web端用户注册时的选择下拉框,比如注册候选择省份城市等.如下图便是一个列表选择框 下拉列表的列表选择项能够通过xml文件的android:entries属性指定,或是在java代码中导入,属性android:prompt是列表项的标题. 一    列表项数据: 实际运用当中,很多下拉列表项的数据实际是可知的,可以放在xml资源文件中.这时,开发者可以通过xml属性进行指定数据. 除了资源文件之外,开发者还能够使用适配器适配数据源.(适配器:

随机推荐