Android之自定义控件一起制作自定义标签

今天我们要实现的效果如下:

Android之自定义控件一起制作自定义标签_第1张图片

当然列表中的标签显示的个数是可控的,实现个数可控的标签的话,我们就需要自定义View。

 

我们自定义一个抽象类继承LinearLayout并实现我们定义的接口:

 

BaseTagView:

 

/**
 * 标签,继承此抽象类
 * @author LinHai Gu
 *
 * @param 
 */
public abstract class BaseTagView extends LinearLayout implements SelectTag{

	private Context mContext;


	public BaseTagView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		mContext = context;
		initView();
	}

	public BaseTagView(Context context, AttributeSet attrs) {
		super(context, attrs);
		mContext = context;
		initView();
	}

	public BaseTagView(Context context) {
		super(context);
		mContext = context;
		initView();

	}

	private void initView() {

		setOrientation(LinearLayout.HORIZONTAL);
	}

	

	/**
	 * 添加标签,可配
	 * @param datas 数据源
	 * @param num 显示的标签数
	 */
	public void addTag(List datas,int num) {
		removeAllViews();
		LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
				LinearLayout.LayoutParams.WRAP_CONTENT,
				LinearLayout.LayoutParams.WRAP_CONTENT);
		params.setMargins(0, 0, 10, 0);
		if (datas.size() > num) {
			for (int i = 0; i < num; i++) {
				T data = datas.get(i);
				TextView textView = (TextView) LayoutInflater.from(mContext)
						.inflate(R.layout.tagtext_view, null);
				textView.setText(getTag(data));
				textView.setLayoutParams(params);
				addView(textView);
			}
		} else {
			for (int i = 0; i < datas.size(); i++) {
				T data = datas.get(i);
				TextView textView = (TextView) LayoutInflater.from(mContext)
						.inflate(R.layout.tagtext_view, null);
				textView.setText(getTag(data));
				textView.setLayoutParams(params);
				addView(textView);

			}
		}

	}

}

 

 

 

 

 

定义接口SelectTag:

 

 

/**
 * 
 * @author LinHai Gu
 *
 * @param 
 */
public interface SelectTag {

	/**
	 * 获取标签内容
	 * @param data
	 * @return
	 */
	public abstract String getTag(T data);
	
}

 

 

 

 

 

在这里为什么用到了泛型,这是因为我们需要的是一个公共的控件,而不是为某一个界面而写的。

在BaseTagView抽象类中的addTag方法中需要导入一个TextView布局文件:

 

tagtext_view:

 



 

 

 

 

 

text_line:是专门给TextView外部添加标签的边框,当然你可以根据需要制作一些好看的标签样式

 

 


   
       
    
       


以上我们的公共控件基本完成。

 

 

这时候假设有一个项目第一个页面从服务器获取到了标签列表,并显示在列表中,标签的值存放在一个PageObject对象中:

PageObject:

 

/**
 * 假设这是某页面请求到的标签数据
 * @author LinHai Gu
 *
 */
public class PageObject implements Serializable{
	private static final long serialVersionUID = 100230230204204021L;
	public String tagName;
}


接着我们就要显示这些标签,因此我们可以为不同的模块去创建不同的标签,假设第一个界面的标签View是这样的:

 

 

public class PageOneTagView extends BaseTagView{

	public PageOneTagView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

	public PageOneTagView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public PageOneTagView(Context context) {
		super(context);
	}
	
	public void setTagList(ArrayList list,int num){
		addTag(list,num);
	}

	@Override
	public String getTag(PageObject data) {
		return data.tagName;
	}

}


通过子类定义setTagList方法传入我们想要显示的标签列表,并显示的个数就行了。

 

 

以下使我们的主布局:

MainActivity:

 

public class MainActivity extends Activity {
	
	private Datapter datapter=new Datapter();
	private ArrayList list=new ArrayList();
	private ListView lv_tag;
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);		
		initData();
		initView();
	}
	
	
	/**
	 * 假设这边是从服务获取到的标签列表
	 */
	private void initData(){
		for(int i=0;i<10;i++){
			PageObject obj=new PageObject();
			obj.tagName="标签"+i;
			list.add(obj);
		}
	}
	
	private void initView(){
		lv_tag=(ListView)findViewById(R.id.lv_list);
		lv_tag.setAdapter(datapter);
	}
	
	

	class Datapter extends BaseAdapter {

		@Override
		public int getCount() {
			return 23;
		}

		@Override
		public Object getItem(int position) {
			return position;
		}

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

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			viewHolder viewh;
			if (convertView == null) {
				viewh = new viewHolder();
				convertView = LayoutInflater.from(MainActivity.this).inflate(
						R.layout.list_item, parent, false);
				viewh.tag = (PageOneTagView) convertView.findViewById(R.id.page_tag);
				convertView.setTag(viewh);
			} else {
				viewh = (viewHolder) convertView.getTag();
			}
			/*
			 * 添加标签,并显示4个标签
			 */
			viewh.tag.setTagList(list, 4);

			return convertView;
		}

	}

	class viewHolder {
		public PageOneTagView tag;
	}
}


activity_main:

 

 



    
    

 

 

 

 

 

list_item:(导入我们继承BaseTagView的类)

 




    

    
    

 

 

 

 

 

 

                                                          个人GitHub项目地址:https://github.com/LinhaiGu/TabView

                                                          转载请注明出处:http://blog.csdn.net/hai_qing_xu_kong/article/details/45919871情绪控_

 

 

 

 

你可能感兴趣的:(Android开发笔记)