Android重写系列(2)——建立在Fragment上的ListView(自定义表格样式)
2015-05-21 21:03
330 查看
这一篇里,我拿出我参与开发的一个项目的部分代码来详细讲解listView的重写,一共包括了几个部分:
1.主要的Fragment
2.listView_item的表格样式
3.Adapter的重写
4.fragment的布局文件
5.数据类(Bean)
第一步:数据层 Bean类 Material.java
提供数据交互用的Bean 系统性的开发都会用到这个,具体作用可以查找相关博文观看。
public class Material extends Entity{ private String material_id; private String material_name; private String total_num; private String specification; private String abc_type; private String receptorderNo; private String order_from_no; private List list; public String getReceptorderNo() { return receptorderNo; } public void setReceptorderNo(String receptorderNo) { this.receptorderNo = receptorderNo; } public String getMaterial_id() { return material_id; } public void setMaterial_id(String material_id) { this.material_id = material_id; } public String getMaterial_name() { return material_name; } public void setMaterial_name(String material_name) { this.material_name = material_name; } public String getTotal_num() { return total_num; } public void setTotal_num(String total_num) { this.total_num = total_num; } public String getSpecification() { return specification; } public void setSpecification(String specification) { this.specification = specification; } public String getAbc_type() { return abc_type; } public void setAbc_type(String abc_type) { this.abc_type = abc_type; } public String getOrder_from_no() { return order_from_no; } public void setOrder_from_no(String order_from_no) { this.order_from_no = order_from_no; } public List getList() { return list; } public void setList(List list) { this.list = list; } }
第二步:fragment_material.xml Fragment的布局文件
<?xml version="1.0" encoding="utf-8"?>
第三步:MaterialAdapter.java 继承Adapter类并重写
public class MaterialAdapter extends BaseAdapter{ private Context context; private MaterialFragment materialFragment ; private List list; public MaterialAdapter(Context context , List list) { this.context = context; this.list = list; materialFragment = new MaterialFragment(context); } @Override public int getCount() { // 返回listview中item的个数,也就是传入数据的大小 return list.size(); } @Override public Object getItem(int position) { // 通过position,返回item的obj return list.get(position); } @Override public long getItemId(int position) { //返回Item的id,0-n return position; } @Override public View getView(final int position, View convertView, ViewGroup arg2) { final ViewHolder holder; final Material material = list.get(position); if(convertView == null){ //通过Layout获得item容器view convertView = LayoutInflater.from(context).inflate(R.layout.list_item, null); holder = new ViewHolder(); holder.tv_material_spec = (TextView) convertView.findViewById(R.id.tv_material_spec); holder.tv_material_name = (TextView) convertView.findViewById(R.id.tv_material_name); holder.radioGroup =(RadioGroup) convertView.findViewById(R.id.radioGroup); holder.rb_1 = (RadioButton) convertView.findViewById(R.id.rb_1); holder.rb_2 = (RadioButton) convertView.findViewById(R.id.rb_2); holder.rb_3 = (RadioButton) convertView.findViewById(R.id.rb_3); //将convertView缓存起来 convertView.setTag(holder); }else{ //调用缓存中的converView,起到优化作用 holder = (ViewHolder) convertView.getTag(); } holder.tv_material_name.setText(material.getMaterial_name()); holder.tv_material_spec.setText(material.getSpecification()); //通过material的type判断当前RadioButton选择了什么值,防止因为切换fragment后,RadioButton的值重置 if(material.getAbc_type()!=null){ if(material.getAbc_type()=="A" ){ holder.rb_1.setChecked(true); } if(material.getAbc_type()=="B" ){ holder.rb_2.setChecked(true); } if(material.getAbc_type()=="C"){ holder.rb_3.setChecked(true); } }else{ } //添加radioGroup的监听器 holder.radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch(checkedId){ case R.id.rb_1: //将选择的值赋予material中的一个属性,之后material保存在list中,将选择的值保存起来. //上面的方式存在漏洞,如果未找到方法解决,可以直接将material中的值保存在SQlist数据库中,再通过查询调用, //但是这种方式将重复执行数据库查询,会占用比较多的资源 material.setAbc_type(holder.rb_1.getText().toString()); break; case R.id.rb_2: material.setAbc_type(holder.rb_2.getText().toString()); break; case R.id.rb_3: material.setAbc_type(holder.rb_3.getText().toString()); break; } materialFragment.setArray(list); } }); return convertView; } public List getList(){ return list; } class ViewHolder{ TextView tv_material_spec; TextView tv_material_name; RadioGroup radioGroup; RadioButton rb_1; RadioButton rb_2; RadioButton rb_3; } }
第四步:list_item.xml 建立listView中item的布局文件
<?xml version="1.0" encoding="utf-8"?>
第五步:在drawable目录下,建立一个xml文件——listview_item_style.xml
这是一个layout扁平化边框样式,在扁平化布局中很常见,这个样式将被设置在list_item.xml和fragment_material.xml的Layout下的background中。
<?xml version="1.0" encoding="utf-8"?>
第六步:MatrialFragment.java 继承Fragment
public class MaterialFragment extends Fragment{ public static final int GETTING_DATA = 0; public static final int FINISH_GETTING_DATA = 1; private Context context; private MyApplication mApplication; private ListView listView; private List materialList; private Map list = new HashMap(); private List arrayList = new ArrayList(); private MaterialAdapter adapter; private List> tlist; public MaterialFragment(Context context) { this.context = context; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //通过inflater()方法获得fragment的布局 View view = inflater.inflate(R.layout.fragment_material, container, false); //在fragment中要通过view调用findViewById(),然后获得listview listView = (ListView) view.findViewById(R.id.listview); //获得数据 materialList = getDatasDB(); //这个可以忽略 mApplication = (MyApplication) getActivity().getApplication(); if(materialList.size()>0){ adapter = new MaterialAdapter(context, materialList); //为listViwe设置适配器 listView.setAdapter(adapter); } return view; } public List getDatasDB(){ //这里是从数据库获取的数据,也可以使用下面的方式填充数据 MaterialDao material = new MaterialDao(context); materialList = material.getMaterialInfos(); // Material item1 = new Material(); // item1.setMaterial_id("6932010062065"); // item1.setMaterial_name("开心饼干"); // item1.setTotal_num("54"); // item1.setSpecification("460×260×180"); // // Material item2 = new Material(); // item2.setMaterial_id("6917878007441"); // item2.setMaterial_name("美心蜂蜜"); // item2.setTotal_num("36"); // item2.setSpecification("395×245×180"); // // Material item3 = new Material(); // item3.setMaterial_id("6932010061853"); // item3.setMaterial_name("怡然话梅糖"); // item3.setTotal_num("40"); // item3.setSpecification("395×295×180"); // list.put(0, item1); // list.put(1, item2); // list.put(2, item3); System.out.println("size---:"+list.size()); return materialList; } @Override public void onAttach(Activity activity) { // TODO Auto-generated method stub super.onAttach(activity); } @Override public void onDestroyView() { // TODO Auto-generated method stub super.onDestroyView(); System.out.println("onDestroyView"); } @Override public void onPause() { super.onPause(); System.out.println("onPause"); } @Override public void onStop() { // TODO Auto-generated method stub super.onStop(); System.out.println("onStop"); } @Override public void onResume() { // TODO Auto-generated method stub super.onResume(); System.out.println("onResume"); } public List getList(){ return materialList; } public void setArray(List arrayList){ this.materialList = arrayList; } }
最后再在MainActivity.java中按使用Fragment的方式调用MaterialFragment就可以了。
相关文章推荐
- android系列学习:tab切换,fragment中嵌套listview,listview自定义item,优化以及onclick
- Android 自定义ListView格局和各Item的样式
- android listview gridview等自定义滚动条样式(非反射)
- 【Android UI】ListView系列二(自定义Adapter订阅新闻栏目)
- Android ListView的滚动条始终显示并且滚动条样式自定义
- Android中使用ListView绘制自定义表格(2)
- Android之自定义ListView滚动条样式
- Android系列之自定义ListView实现左右滑删除
- android listview实现表格样式
- Android-->Dialog/DialogFragment宽度高度修改/全屏,自定义样式
- Android ListView的滚动条始终显示并且滚动条样式自定义
- android 实现拉出回弹效果通过自定义ListView重写overScrollBy()
- Android-->Dialog/DialogFragment宽度高度修改/全屏,自定义样式
- Android滚轮控件,基于ListView实现,可以自定义样式。
- Android ListView的滚动条始终显示并且滚动条样式自定义
- Android-->Dialog/DialogFragment宽度高度修改/全屏,自定义样式
- Android中使用ListView绘制自定义表格(2)
- Android 自定义ListView系列之适配器模式
- Android学习之ListView自定义样式
- Android-->Dialog/DialogFragment宽度高度修改/全屏,自定义样式