github
APK下载
使用方法
将libray模块复制到项目中,或者直接在build.gradle中依赖:
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
dependencies {
compile 'com.github.AnJiaoDe:MultiFlowLayout:1.1.1'
}
1.TextView
<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
<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
<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
<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
简书