Android 流式布局FlowLayout(搜索历史),多布局、删除、添加
16lz
2021-01-23
github
APK下载
使用方法
将libray模块复制到项目中,或者直接在build.gradle中依赖:
allprojects { repositories { maven { url 'https://jitpack.io' } } }
dependencies { compile 'com.github.AnJiaoDe:MultiFlowLayout:1.1.1' }
1.TextView
<?xml version="1.0" encoding="utf-8"?><com.cy.cyflowlayoutlibrary.FlowLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/fl" android:layout_width="match_parent" app:width_space="10dp"//宽间距 app:height_space="10dp"//高间距 android:padding="10dp" android:layout_height="400dp">com.cy.cyflowlayoutlibrary.FlowLayout>
package com.cy.cyflowlayout;import android.os.Bundle;import android.view.View;import com.cy.cyflowlayoutlibrary.FlowLayout;import com.cy.cyflowlayoutlibrary.FlowLayoutAdapter;import java.util.ArrayList;import java.util.List;public class TVActivity extends BaseActivity { private FlowLayoutAdapter flowLayoutAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_tv); List list=new ArrayList<>(); list.add("环境"); list.add("环境"); list.add("如果皇太后"); list.add("人皇太后"); list.add("环境"); list.add("然后"); list.add("环境"); list.add("环境"); list.add("然后钛合金"); list.add("环境"); list.add("任何人挺好"); list.add("环境"); list.add("发个黄庭坚"); list.add("环境"); list.add("分分然后"); list.add("环境"); list.add("环境"); list.add("凤凰台和"); list.add("环境"); list.add("环境"); list.add("环境"); list.add("发个荣誉感"); list.add("环境"); list.add("复合肥"); list.add("环境"); list.add("发然后"); list.add("环的风格让他很认同和境"); list.add("的富贵华庭"); list.add("的富"); flowLayoutAdapter=new FlowLayoutAdapter(list) { @Override public void bindDataToView(ViewHolder holder, int position, String bean) { holder.setText(R.id.tv,bean); } @Override public void onItemClick(int position, String bean) { showToast("点击"+position); } @Override public int getItemLayoutID(int position, String bean) { return R.layout.item_tv; } }; ((FlowLayout)findViewById(R.id.fl)).setAdapter(flowLayoutAdapter); } @Override public void onClick(View v) { }}
2.TextView+Scroll
<?xml version="1.0" encoding="utf-8"?><com.cy.cyflowlayoutlibrary.FlowLayoutScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/flsv" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp" app:height_space="10dp" app:width_space="10dp">com.cy.cyflowlayoutlibrary.FlowLayoutScrollView>
package com.cy.cyflowlayout;import android.os.Bundle;import android.view.View;import com.cy.cyflowlayoutlibrary.FlowLayoutAdapter;import com.cy.cyflowlayoutlibrary.FlowLayoutScrollView;import java.util.ArrayList;import java.util.List;public class TVScrollActivity extends BaseActivity { private FlowLayoutAdapter flowLayoutAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_tvscroll); List list=new ArrayList<>(); list.add("环境"); list.add("环境"); list.add("如果皇太后"); list.add("人皇太后"); list.add("环境"); list.add("然后"); list.add("环境"); list.add("环境"); list.add("然后钛合金"); list.add("环境"); list.add("任何人挺好"); list.add("环境"); list.add("发个黄庭坚"); list.add("环境"); list.add("分分然后"); list.add("环境"); list.add("环境"); list.add("凤凰台和"); list.add("环境"); list.add("环境"); list.add("环境"); list.add("发个荣誉感"); list.add("环境"); list.add("复合肥"); list.add("环境"); list.add("发然后"); list.add("环的风格让他很认同和境"); list.add("的富贵华庭"); list.add("环境"); list.add("环境"); list.add("如果皇太后"); list.add("人皇太后"); list.add("环境"); list.add("然后"); list.add("环境"); list.add("环境"); list.add("然后钛合金"); list.add("环境"); list.add("任何人挺好"); list.add("环境"); list.add("发个黄庭坚"); list.add("环境"); list.add("分分然后"); list.add("环境"); list.add("环境"); list.add("凤凰台和"); list.add("环境"); list.add("环境"); list.add("环境"); list.add("发个荣誉感"); list.add("环境"); list.add("复合肥"); list.add("环境"); list.add("发然后"); list.add("环的风格让他很认同和境"); list.add("的富贵华庭"); list.add("环境"); list.add("环境"); list.add("如果皇太后"); list.add("人皇太后"); list.add("环境"); list.add("然后"); list.add("环境"); list.add("环境"); list.add("然后钛合金"); list.add("环境"); list.add("任何人挺好"); list.add("环境"); list.add("发个黄庭坚"); list.add("环境"); list.add("分分然后"); list.add("环境"); list.add("环境"); list.add("凤凰台和"); list.add("环境"); list.add("环境"); list.add("环境"); list.add("发个荣誉感"); list.add("环境"); list.add("复合肥"); list.add("环境"); list.add("发然后"); list.add("环的风格让他很认同和境"); list.add("的富贵华庭"); flowLayoutAdapter=new FlowLayoutAdapter(list) { @Override public void bindDataToView(ViewHolder holder, int position, String bean) { holder.setText(R.id.tv,bean); } @Override public void onItemClick(int position, String bean) { showToast("点击"+position); } @Override public int getItemLayoutID(int position, String bean) { return R.layout.item_tv; } }; ((FlowLayoutScrollView)findViewById(R.id.flsv)).setAdapter(flowLayoutAdapter); } @Override public void onClick(View v) { }}
3.layout+scroll+remove+add
<?xml version="1.0" encoding="utf-8"?><com.cy.cyflowlayoutlibrary.FlowLayoutScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/flsv" android:padding="6dp" android:layout_width="match_parent" android:layout_height="match_parent">com.cy.cyflowlayoutlibrary.FlowLayoutScrollView>
package com.cy.cyflowlayout;import android.os.Bundle;import android.view.View;import com.cy.cyflowlayoutlibrary.FlowLayoutAdapter;import com.cy.cyflowlayoutlibrary.FlowLayoutScrollView;import java.util.ArrayList;import java.util.List;public class LayoutScrollActivity extends BaseActivity { private FlowLayoutAdapter flowLayoutAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_layout); List list=new ArrayList<>(); list.add("环境"); list.add("环境"); list.add("如果皇太后"); list.add("人皇太后"); list.add("环境"); list.add("然后"); list.add("环境"); list.add("环境"); list.add("然后钛合金"); list.add("环境"); list.add("任何人挺好"); list.add("环境"); list.add("发个黄庭坚"); list.add("环境"); list.add("分分然后"); list.add("环境"); list.add("环境"); list.add("凤凰台和"); list.add("环境"); list.add("环境"); list.add("环境"); list.add("发个荣誉感"); list.add("环境"); list.add("复合肥"); list.add("环境"); list.add("发然后"); list.add("环的风格让他很认同和境"); list.add("的富贵华庭"); list.add("环境"); list.add("环境"); list.add("如果皇太后"); list.add("人皇太后"); list.add("环境"); list.add("然后"); list.add("环境"); list.add("环境"); list.add("然后钛合金"); list.add("环境"); list.add("任何人挺好"); list.add("环境"); list.add("发个黄庭坚"); list.add("环境"); list.add("分分然后"); list.add("环境"); list.add("环境"); list.add("凤凰台和"); list.add("环境"); list.add("环境"); list.add("环境"); list.add("发个荣誉感"); list.add("环境"); list.add("复合肥"); list.add("环境"); list.add("发然后"); list.add("环的风格让他很认同和境"); list.add("的富贵华庭"); list.add("环境"); list.add("环境"); list.add("如果皇太后"); list.add("人皇太后"); list.add("环境"); list.add("然后"); list.add("环境"); list.add("环境"); list.add("然后钛合金"); list.add("环境"); list.add("任何人挺好"); list.add("环境"); list.add("发个黄庭坚"); list.add("环境"); list.add("分分然后"); list.add("环境"); list.add("环境"); list.add("凤凰台和"); list.add("环境"); list.add("环境"); list.add("环境"); list.add("发个荣誉感"); list.add("环境"); list.add("复合肥"); list.add("环境"); list.add("发然后"); list.add("环的风格让他很认同和境"); list.add("的富贵华庭"); flowLayoutAdapter = new FlowLayoutAdapter(list) { @Override public void bindDataToView(ViewHolder holder, int position, String bean) { holder.setText(R.id.tv,bean); } @Override public void onItemClick(int position, String bean) { remove(position); } @Override public int getItemLayoutID(int position, String bean) { return R.layout.item_layout; } }; ((FlowLayoutScrollView)findViewById(R.id.flsv)).setAdapter(flowLayoutAdapter); } @Override public void onClick(View v) { }}
4.layout+multi+scroll+remove+add
<?xml version="1.0" encoding="utf-8"?><com.cy.cyflowlayoutlibrary.FlowLayoutScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/flsv" android:padding="6dp" android:layout_width="match_parent" android:layout_height="match_parent">com.cy.cyflowlayoutlibrary.FlowLayoutScrollView>
package com.cy.cyflowlayout;import android.os.Bundle;import android.view.View;import com.cy.cyflowlayoutlibrary.FlowLayoutAdapter;import com.cy.cyflowlayoutlibrary.FlowLayoutScrollView;import java.util.ArrayList;import java.util.List;public class LayoutMultiScrollActivity extends BaseActivity { private FlowLayoutAdapter<String> flowLayoutAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_layout_multi_scroll); List<String> list=new ArrayList<>(); list.add("会囧哥"); list.add("环境"); list.add("如果皇太后"); list.add("人皇太后"); list.add("环境"); list.add("然后"); list.add("环境"); list.add("环境"); list.add("然后钛合金"); list.add("环境"); list.add("任何人挺好"); list.add("环境"); list.add("发个黄庭坚"); list.add("环境"); list.add("分分然后"); list.add("环境"); list.add("环境"); list.add("凤凰台和"); list.add("环境"); list.add("环境"); list.add("环境"); list.add("发个荣誉感"); list.add("环境"); list.add("复合肥"); list.add("环境"); list.add("发然后"); list.add("环的风格让他很认同和境"); list.add("的富贵华庭"); list.add("环境"); list.add("环境"); list.add("如果皇太后"); list.add("人皇太后"); list.add("环境"); list.add("然后"); list.add("环境"); list.add("环境"); list.add("然后钛合金"); list.add("环境"); list.add("任何人挺好"); list.add("环境"); list.add("发个黄庭坚"); list.add("环境"); list.add("分分然后"); list.add("环境"); list.add("环境"); list.add("凤凰台和"); list.add("环境"); list.add("环境"); list.add("环境"); list.add("发个荣誉感"); list.add("环境"); list.add("复合肥"); list.add("环境"); list.add("发然后"); list.add("环的风格让他很认同和境"); list.add("的富贵华庭"); list.add("环境"); list.add("环境"); list.add("如果皇太后"); list.add("人皇太后"); list.add("环境"); list.add("然后"); list.add("环境"); list.add("环境"); list.add("然后钛合金"); list.add("环境"); list.add("任何人挺好"); list.add("环境"); list.add("发个黄庭坚"); list.add("环境"); list.add("分分然后"); list.add("环境"); list.add("环境"); list.add("凤凰台和"); list.add("环境"); list.add("环境"); list.add("环境"); list.add("发个荣誉感"); list.add("环境"); list.add("复合肥"); list.add("环境"); list.add("发然后"); list.add("环的风格让他很认同和境"); list.add("的富贵华庭"); flowLayoutAdapter = new FlowLayoutAdapter<String>(list) { @Override public void bindDataToView(ViewHolder holder, int position, String bean) { holder.setText(R.id.tv,bean); } @Override public void onItemClick(int position, String bean) { if (position==0||position==1||position==2){ return; } remove(position); } @Override public int getItemLayoutID(int position, String bean) { if (position==0||position==1||position==2){ return R.layout.item_layout2; } return R.layout.item_layout; } }; ((FlowLayoutScrollView)findViewById(R.id.flsv)).setAdapter(flowLayoutAdapter); } @Override public void onClick(View v) { }}
FlowLayoutAdapter:
package com.cy.cyflowlayoutlibrary;import android.graphics.Bitmap;import android.util.SparseArray;import android.view.LayoutInflater;import android.view.View;import android.widget.EditText;import android.widget.ImageView;import android.widget.ProgressBar;import android.widget.TextView;import java.util.Collection;import java.util.List;/** * Created by cy on 2018/2/8. */public abstract class FlowLayoutAdapter { private OnDataSetChangedListener onDataSetChangedListener; private List list_bean; public FlowLayoutAdapter( List list_bean) { this.list_bean = list_bean; } public int getCount() { return list_bean.size(); } public final View getView(FlowLayout parent, final int position) { View view = LayoutInflater.from(parent.getContext()).inflate(getItemLayoutID(position, list_bean.get(position)), parent, false); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onItemClick(position, list_bean.get(position)); } }); view.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { onItemLongClick(position,list_bean.get(position)); return true; } }); bindDataToView(new ViewHolder(view), position, list_bean.get(position)); return view; } //填充数据 public abstract void bindDataToView(ViewHolder holder, int position, T bean); /* ItemView的单击事件 @param position */ public abstract void onItemClick(int position, T bean); public void onItemLongClick(int position, T bean){} /* 取得ItemView的布局文件 @return */ public abstract int getItemLayoutID(int position, T bean); public void remove(int position) { list_bean.remove(position); notifyDataSetChanged(); } public void add(T bean) { list_bean.add(bean); notifyDataSetChanged(); } public void notifyDataSetChanged(){ if(onDataSetChangedListener!=null){ onDataSetChangedListener.onDataSetChanged(); } } public void addNoNotify(T bean) { list_bean.add(bean); } public void addToHead(T bean) { list_bean.add(0, bean); } public int addAll(List beans) { list_bean.addAll(beans); notifyDataSetChanged(); return beans.size(); } public void addAll(Collection c) { list_bean.addAll(c); notifyDataSetChanged(); } public int clearAddAll(List beans) { list_bean.clear(); list_bean.addAll(beans); notifyDataSetChanged(); return beans.size(); } public void addAllToHead(List beans) { list_bean.addAll(0, beans); notifyDataSetChanged(); } public void clear() { list_bean.clear(); notifyDataSetChanged(); } public void setOnDataSetChangedListener(OnDataSetChangedListener onDataSetChangedListener) { this.onDataSetChangedListener = onDataSetChangedListener; } public interface OnDataSetChangedListener{ public void onDataSetChanged(); } public static class ViewHolder { private View itemView; private SparseArray array_view; public ViewHolder(View itemView) { this.itemView = itemView; array_view = new SparseArray(); } public T getView(int viewId) { View view = array_view.get(viewId); if (view == null) { view = itemView.findViewById(viewId); array_view.put(viewId, view); } return (T) view; } public ViewHolder setVisible(int res_id) { getView(res_id).setVisibility(View.VISIBLE); return this; } public ViewHolder setInVisible(int res_id) { getView(res_id).setVisibility(View.INVISIBLE); return this; } public void setViewGone(int res_id) { getView(res_id).setVisibility(View.GONE); } public void setViewVisible(int res_id) { getView(res_id).setVisibility(View.VISIBLE); } public void setText(int tv_id, String text) { TextView tv = getView(tv_id); tv.setText(nullToString(text)); } public String nullToString(Object object) { return object == null ? "" : object.toString(); } public void setPriceText(int tv_id, String text) { TextView tv = getView(tv_id); tv.setText("¥" + text); } public void setCountText(int tv_id, String text) { TextView tv = getView(tv_id); tv.setText("x" + text); } public void setCountText(int tv_id, int text) { TextView tv = getView(tv_id); tv.setText("x" + text); } public void setPriceText(int tv_id, int text) { TextView tv = getView(tv_id); tv.setText("¥" + text); } public void setPriceText(int tv_id, float text) { TextView tv = getView(tv_id); tv.setText("¥" + text); } public void setText(int tv_id, int text) { TextView tv = getView(tv_id); tv.setText(String.valueOf(nullToString(text))); } public void setTextColor(int tv_id, int color) { TextView tv = getView(tv_id); tv.setTextColor(color); } public String getTVText(int tv_id) { TextView tv = getView(tv_id); return tv.getText().toString().trim(); } public String getETText(int tv_id) { EditText tv = getView(tv_id); return tv.getText().toString().trim(); } public void setBackgroundResource(int v_id, int resid) { View view = getView(v_id); view.setBackgroundResource(resid); } public void setImageBitmap(int v_id, Bitmap bitmap) { ImageView view = getView(v_id); view.setImageBitmap(bitmap); } public void setImageResource(int v_id, int resID) { ImageView view = getView(v_id); view.setImageResource(resID); } public void setProgress(int progress_id, int progress) { ProgressBar progressBar = getView(progress_id); progressBar.setProgress(progress); } public void setOnClickListener(int res_id, View.OnClickListener onClickListener) { getView(res_id).setOnClickListener(onClickListener); } public void setOnLongClickListener(int res_id, View.OnLongClickListener onLongClickListener) { getView(res_id).setOnLongClickListener(onLongClickListener); } }}
参考:Android 自定义控件
GitHub
CSDN
简书
微信公众号
QQ群
更多相关文章
- 第一章 andriod studio 安装与环境搭建
- Android——开发环境
- Android之adb环境变量配置
- android 目录结构,adb环境变量配置
- Android 开发环境入门
- Windows环境下Android Studio系列4—界面介绍
- Android ASE 脚本环境
- 工作环境搭建(8) - CentOS7命令行安装Android SDK
- Ubunu下搭建android NDK环境