稀稀拉拉学了有快1年的Android了,但是依然跟刚入门的小白一样,用到啥学啥,上网查别人的代码,然后复制粘贴过去,最后什么都没学到,现在是深有体会,我希望记录一些知识点,踏踏实实的走好每一步,希望刚入门的小白能用到。
首先Android Studio中有许多系统自带的空间,比较常见是TextView,EditView,ImageView,Button,ImageButton,
等等许多的空间,现在我来介绍一种常用的空间——————ListView———————
ListView 就是把展示的东西一条条展示出来 例如这样:虽然比较丑 但是起码实现了ListView
接下来我来一步步介绍一下,并且附上源码,如何写一个比较好的ListView:
1.内布局(我自己这样叫)shopfacelist.xml文件
就是白色区域内的布局,白色区域中的布局自己去写,写成什么样的布局,就会展示什么样的布局
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/cardview_light_background" android:orientation="vertical"> <LinearLayout android:id="@+id/rela_1" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="4dp" android:layout_alignTop="@+id/view_1" android:layout_alignParentLeft="true" android:layout_alignParentStart="true"> <ImageView android:id="@+id/food_Image" android:layout_width="100dp" android:layout_height="100dp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_weight="1"> <TextView android:id="@+id/food_Name" android:layout_width="match_parent" android:layout_height="40dp" android:layout_marginTop="10dp" android:gravity="center" android:text="凉皮" android:textColor="@color/black" android:textSize="18sp" android:textStyle="bold|normal" /> <TextView android:layout_width="100dp" android:layout_height="40dp" android:id="@+id/food_Price" android:text="5元" android:textSize="24sp" android:gravity="center" android:textColor="@color/¥color" android:layout_marginLeft="8dp" android:layout_marginStart="8dp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_weight="1"> <TextView android:id="@+id/delete_food" android:layout_width="match_parent" android:layout_height="40dp" android:layout_marginTop="20dp" android:background="@color/blackline" android:gravity="center" android:text="删除" android:textSize="18sp" /> <TextView android:id="@+id/show_Sole_Count" android:layout_width="match_parent" android:layout_height="30dp" android:text="月售" android:gravity="center" /> </LinearLayout> </LinearLayout> </RelativeLayout>
2.ListView fragment_perfood.xml文件
在b.xml文件中,我们会安放ListView控件并且设置ID
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/fragment_perFood" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@mipmap/image_10"> <TextView android:id="@+id/show_shopping_cart" android:layout_width="match_parent" android:layout_height="50dp" android:gravity="center" android:textSize="20sp" android:text="购物车" android:layout_alignParentTop="true" android:layout_alignParentStart="true" /> <TextView android:id="@+id/in_out_count" android:layout_width="100dp" android:layout_height="30dp" android:gravity="center" android:text="消费明细" android:layout_alignParentTop="true" android:layout_marginTop="10dp" android:layout_below="@id/show_shopping_cart" android:layout_alignParentRight="true" android:background="@color/moneyColor"/> <ListView android:id="@+id/listView_perSomething" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_marginEnd="10dp" android:divider="#00000000" android:dividerHeight="18dp" android:layout_below="@+id/show_shopping_cart"></ListView> <com.indes.interfacedesign.FloatActionbutton.DrawFloatActionButton android:id="@+id/fab_payfor" android:layout_width="wrap_content" android:layout_height="wrap_content" android:backgroundTint="#ff87ffeb" android:src="@drawable/icon_zhifubao" android:layout_alignParentRight="true" android:layout_marginEnd="30dp" android:layout_marginTop="400dp" app:rippleColor="@android:color/holo_green_dark" /> </RelativeLayout>
3.数据源类 CartResource.java
如果自定义的话,那么你就必须要有数据源,每个ListView的Item(子项),就是图片中的白框,内容基本都是不一样的,图片中的Item的内容是因为在初始化的时候每个Item的数据利用循环就变的一模一样了。
public class CartResource { private String onlyFlag; //给每个商品加入唯一标识码 private int imageId; //图片ID private String foodName; //食物名称 private String foodPrice; //食物价格 private String monthSoleCount; //月售的数量 private String buttonId; //删除 public CartResource(String onlyFlag,int imageId, String foodName, String foodPrice, String monthSoleCount, String buttonId) { this.onlyFlag = onlyFlag; this.imageId = imageId; this.foodName = foodName; this.foodPrice = foodPrice; this.monthSoleCount = monthSoleCount; this.buttonId = buttonId; } public String getOnlyFlag() { return onlyFlag; } public void setOnlyFlag(String onlyFlag) { this.onlyFlag = onlyFlag; } public int getImageId() {return imageId;} public void setImageId(int imageId) { this.imageId = imageId; } public String getFoodName() { return foodName; } public void setFoodName(String foodName) { this.foodName = foodName; } public String getFoodPrice() { return foodPrice; } public void setFoodPrice(String foodPrice) { this.foodPrice = foodPrice; } public String getMonthSoleCount() { return monthSoleCount; } public void setMonthSoleCount(String monthSoleCount) { this.monthSoleCount = monthSoleCount; } public String getButtonId() { return buttonId; } public void setButtonId(String buttonId) { this.buttonId = buttonId; } }
4.适配器 CartAdapter.java
自定义适配器来适配数据源
public class CartAdapter extends ArrayAdapter<CartResource>{ private int resourceId; public CartAdapter(@NonNull Context context, @LayoutRes int resource, @NonNull List<CartResource> objects) { super(context, resource, objects); resourceId = resource; } @NonNull @Override public View getView(final int position, @Nullable View convertView, @NonNull final ViewGroup parent) { CartResource s = getItem(position); View view; if(convertView == null){ view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false); }else { view = convertView; } /** * 删除菜品 */ ImageView imageId = (ImageView) view.findViewById(R.id.food_Image); TextView foodName = (TextView)view.findViewById(R.id.food_Name); TextView foodPricce = (TextView)view.findViewById(R.id.food_Price); TextView delete = (TextView) view.findViewById(R.id.delete_food); TextView monthSoleOut = (TextView)view.findViewById(R.id.show_Sole_Count); imageId.setImageResource(s.getImageId()); foodName.setText(s.getFoodName()); foodPricce.setText(s.getFoodPrice()); /** * 删除菜品是点击事件 */ delete.setText(s.getButtonId()); delete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String onlyflag = getItem(position).getOnlyFlag(); //商品编号 remove(getItem(position)); Toast.makeText(parent.getContext(),"删除了编号为"+onlyflag+"的菜品", Toast.LENGTH_SHORT).show(); } }); delete.setText(s.getButtonId()); monthSoleOut.setText(s.getMonthSoleCount()); return view; } }
5.活动 Fragment_perFood.java
在活动中初始化数据源,绑定适配器。
public class Fragment_perFood extends Fragment {
private List mList;
public CartResource reInit;
private CartAdapter ReAdapter;
private ListView listView;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_perfood,null);
/**
* 绑定数据源
*/
mList = new ArrayList<CartResource>();
//初始化适配器
Init();
//必须刷新才能是添加的东西展示出来
ReAdapter = new CartAdapter(getActivity(),R.layout.shopfacelist_1,mList);
listView = (ListView)view.findViewById(R.id.listView_perSomething);
listView.setAdapter(ReAdapter);
return view;
}
/*
* 当前的数据
*/
public void Init(){
for(int i = 0 ;i<50 ; i++){
reInit = new CartResource(12306+i+"",R.mipmap.image_7,"鱼香茄子","8¥","月售3666份","删除");
mList.add(reInit);
}
}
}
记录一下,方便自己以后用到,也方便刚入门的小白上手。
在这里我用到了Fragment(碎片),一般在Andriod平板中很常见,但是因为项目需要所以就用到了。
这里5种代码都齐全了,所以复制的时候大家可以把Fragment换成Activity来用,新建Activity,将红色代码复制进去就行了。
说一下可能会遇到的问题:
1.代码中用到的图片肯定要换,不然报错。
2.Activity那块一定要注意
3.我把控件的响应事件放在Adapter
4.导包
5.代码中有悬浮按钮的空间,是我自定义的,可以删除。还有下边两个Fragment。