您的位置:首页 > 移动开发 > Android开发

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就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息