实验过程中的学习:
1、布局:在实验过程中,将每个列表项中的控件通过线性布局LinearLayout进行排列,其中对于checkbox是RadioGroup的子项,所以需要通过RadioGroup控制。将商家名称,商品图片,商品名称,商品价格作为子项,对于商品的加减操作,将有加减+ - 符号作为按钮,表示商品数量的为textview,再对其进行点击监听事件处理。
2、叠加效果:在实验过程中,对于叠加效果的使用,可以在drawable中定义形状,将其作为图片的背景,设置好边间距和边框大小即可
3、小窗口的使用 :设置监听,对dialog中的参数设置
4、对列表项的长按、点击效果、Toast的使用
实验过程:
1、商品数量按钮加减的效果
商品数量可以增加,可以减少,但是数量不得少于1个
2、结算按钮的效果
当未选中商品时,则点击结算按钮出现,无选中项的样式,选中商品则出现小弹窗,可以知道选中商品的数量,点击取消则出现取消购买的字样,确定则出现购买成功的字样。
3、对于列表项的处理
点击列表项则出现选中字样,表示选中该产品,长按则出现小窗口,表示接下的操作,同时点击确定、取消的按钮出现的结果字样不一样。
4、弹窗使用格式的不一样
对于Toast中的参数的使用,不同参数的使用对应不用的呈现效果,在实验过程分别出现两个中情况,分别是信息为一行使用massage,两行或者多行则使用builder.setItems(new String[]{“移入收藏夹”,“删除”,“找相似”},null);进行设置。
实验中遇到的问题:
1、布局管理的不正确,对于约束布局的了解不够充分,无法较好的使用,在实验过程中使用较为麻烦的线性布局,造成代码的冗长。
在学习过程中,对于listview列表控件的数据中,对于checkBox的使用,想用通过点击listview列表来实现点击效果,其中使得checkBox能够成功。
遇到的问题:
2、对于点击列表出现错位的现象
原因:对于listview控件中,页面中设置的列表是有限的,出现列表数据出现复用的现象,但是出现复用的话,没有将数据进行存储,刷新。
在listAdapter中,对于checkBox的状态进行存储。
3、无法出现点击的效果无法出现在对应位置
是因为所使用的CheckBox不是我所需要的列表控件中的CheckBox,所以通过点击监听可以得知通过view.findViewById(R.id.checkbox);进行定义即可。
特别注意所属关系,这已经是第二次出现的问题。
代码见下:
主函数代码:
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private ListView mListView;
private MyAdapter myAdapter;
private int number = 0;
private List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
//定义一个列表集合
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ButterKnife.bind(this);
initData();
mListView = (ListView) findViewById(R.id.listview);
myAdapter = new MyAdapter(list, this);
mListView.setAdapter(myAdapter);
//listview的点击事件
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// checkBox.setChecked(!checkBox.isClickable());
CheckBox checkBox= view.findViewById(R.id.checkbox);
boolean s = (boolean) list.get(position).get("checkbox");
if (s == true) {
list.get(position).put("checkbox", false);
checkBox.setChecked(false);
number--;
} else {
list.get(position).put("checkbox", true);
checkBox.setChecked(true);
number++;
}
}
});
//listview长按事件
mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
dialog2();
return true;
}
});
//recyclerView.addOnItemTouchListener(new RecyclerItemClickListenerView(this,mRecyclerView,listener));
//对button结算进行判断,如果选中则item则弹出确认弹窗,没有选中提示”无选中项”
Button count = findViewById(R.id.count);
count.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(number==0){
Toast.makeText(v.getContext(), "无选中项", Toast.LENGTH_LONG).show();
}
else
dialog1_1();
}
});
}
//小弹窗
private void dialog1_1(){
//先new出一个监听器,设置好监听
DialogInterface.OnClickListener dialogOnclicListener=new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
switch(which){
case Dialog.BUTTON_POSITIVE:
Toast.makeText(MainActivity.this, "购买成功" , Toast.LENGTH_SHORT).show();
break;
case Dialog.BUTTON_NEGATIVE:
Toast.makeText(MainActivity.this, "取消购买", Toast.LENGTH_SHORT).show();
break;
}
}
};
//dialog参数设置
AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到构造器
builder.setTitle("确定购买吗?"); //设置标题
builder.setMessage("你已经选中"+ number+"件商品"); //设置内容
builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id即可
builder.setPositiveButton("确认",dialogOnclicListener);
builder.setNegativeButton("取消", dialogOnclicListener);
builder.create().show();
}
//长按小弹窗
private void dialog2(){
//先new出一个监听器,设置好监听
DialogInterface.OnClickListener dialogOnclicListener=new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
switch(which){
case Dialog.BUTTON_POSITIVE:
Toast.makeText(MainActivity.this, "操作成功" , Toast.LENGTH_SHORT).show();
break;
case Dialog.BUTTON_NEGATIVE:
Toast.makeText(MainActivity.this, "操作取消", Toast.LENGTH_SHORT).show();
break;
}
}
};
//dialog参数设置
AlertDialog.Builder builder=new AlertDialog.Builder(this); //先得到构造器
builder.setTitle("选项菜单"); //设置标题
builder.setItems(new String[]{"移入收藏夹","删除","找相似"},null);
builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id即可
builder.setPositiveButton("确认",dialogOnclicListener);
builder.setNegativeButton("取消", dialogOnclicListener);
builder.create().show();
}
private void initData() {
//1
Map<String, Object> map = new HashMap<String, Object>();
map.put("brand", "天猫超市");
map.put("img", R.drawable.tls);
map.put("title", "蒙牛特仑苏纯牛奶");
map.put("price", "¥39.9");
map.put("stock", "12");
map.put("checkbox", false);
list.add(map);
//2
map = new HashMap<String, Object>();
map.put("brand", "三只松鼠");
map.put("img", R.drawable.bgg);
map.put("title", "碧根果");
map.put("price", "¥29.8");
map.put("stock", "23");
map.put("checkbox", false);
list.add(map);
//3
map = new HashMap<String, Object>();
map.put("brand", "伊利");
map.put("img", R.drawable.smilk);
map.put("title", "酸奶");
map.put("price", "¥19.9");
map.put("stock", "78");
map.put("checkbox", false);
list.add(map);
//4
map = new HashMap<String, Object>();
map.put("brand", "天猫超市");
map.put("img", R.drawable.bug);
map.put("title", "大容量大学生背包");
map.put("price", "¥49.9");
map.put("stock", "22");
map.put("checkbox", false);
list.add(map);
//5
map = new HashMap<String, Object>();
map.put("brand", "");
map.put("img", R.drawable.cloth);
map.put("title", "薄外套");
map.put("price", "¥119.9");
map.put("stock", "33");
map.put("checkbox", false);
list.add(map);
//6
map = new HashMap<String, Object>();
map.put("brand", "天猫超市");
map.put("img", R.drawable.cloth2);
map.put("title", "衣服");
map.put("price", "¥29.9");
map.put("stock", "12");
map.put("checkbox", false);
list.add(map);
//7
map = new HashMap<String, Object>();
map.put("brand", "天猫超市");
map.put("img", R.drawable.cloth3);
map.put("title", "大学生外套");
map.put("price", "¥44.9");
map.put("stock", "24");
map.put("checkbox", false);
list.add(map);
//8
map = new HashMap<String, Object>();
map.put("brand", "天猫超市");
map.put("img", R.drawable.ww1);
map.put("title", "洗衣液");
map.put("price", "¥59.9");
map.put("stock", "23");
map.put("checkbox", false);
list.add(map);
//9
map = new HashMap<String, Object>();
map.put("brand", "天猫超市");
map.put("img", R.drawable.ww2);
map.put("title", "洗衣凝珠");
map.put("price", "¥162.9");
map.put("stock", "92");
map.put("checkbox", false);
list.add(map);
//10
map = new HashMap<String, Object>();
map.put("brand", "天猫超市");
map.put("img", R.drawable.xjj);
map.put("title", "洗衣液");
map.put("price", "¥49.9");
map.put("stock", "24");
map.put("checkbox", false);
list.add(map);
//11
map = new HashMap<String, Object>();
map.put("brand", "蓝月亮");
map.put("img", R.drawable.xyiy2);
map.put("title", "洗衣液");
map.put("price", "¥12.9");
map.put("stock", "22");
map.put("checkbox", false);
list.add(map);
//12
map = new HashMap<String, Object>();
map.put("brand", "天猫超市");
map.put("img", R.drawable.xl);
map.put("title", "项链");
map.put("price", "¥111.9");
map.put("stock", "13");
map.put("checkbox", false);
list.add(map);
}
}
ListView适配器的代码
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
import java.util.Map;
//自定义的Adapter
public class MyAdapter extends BaseAdapter {
private List<Map<String,Object>> datas;
private Context mContext;
private int num = 1;
//构造方法
public MyAdapter(List<Map<String ,Object>> datas,Context mContext){
this.datas = datas;
this.mContext = mContext;
}
//重写BaseAdapter中的方法
public int getCount(){
//返回数据的总数
return datas.size();
}
public Object getItem(int position){
//返回在list中指定位置的数据的内容
return datas.get(position);
}
public long getItemId(int position){
//返回数据在list中所在的位置
return position;
}
public View getView(int position, View converView, ViewGroup parent){
ViewHodle holder;
if(converView == null) {
//使用自定义的布局文件作为layout
converView = LayoutInflater.from(mContext).inflate(R.layout.list_item_layout, null);
//减少findView的次数
holder = new ViewHodle();
//初始化布局中的元素
holder.brand = (TextView) converView.findViewById(R.id.brand);
holder.mImageView = (ImageView) converView.findViewById(R.id.imageview);
holder.mTextView1 = (TextView) converView.findViewById(R.id.textview1);
holder.mTextView2 = (TextView) converView.findViewById(R.id.textview2);
holder.mTextView3 = (TextView) converView.findViewById(R.id.textview3);
holder.mCheckBox = (CheckBox) converView.findViewById(R.id.checkbox);
TextView textView = converView.findViewById(R.id.number);
Button decrease = converView.findViewById(R.id.decrease);
Button add = converView.findViewById(R.id.add);
numberCount(textView, decrease, add);
converView.setTag(holder);
}
else{
holder = (ViewHodle)converView.getTag();
}
//从传入的数据中提取数据并绑定到指定的view中
holder.brand.setText(datas.get(position).get("brand").toString());
holder.mImageView.setImageResource((Integer)datas.get(position).get("img"));
holder.mTextView1.setText(datas.get(position).get("title").toString());
holder.mTextView2.setText(datas.get(position).get("price").toString());
holder.mTextView3.setText(datas.get(position).get("stock").toString());
holder.mCheckBox.setChecked((Boolean) datas.get(position).get("checkbox"));
// 判断checkbox的状态
// holder.mButton.setText(datas.get(position).get("button").toString());
return converView;
}
class ViewHodle{
TextView brand;
ImageView mImageView;
TextView mTextView1;
TextView mTextView2;
TextView mTextView3;
CheckBox mCheckBox;
}
//对于加减的运算
public void numberCount(final TextView textView, Button decrease, Button add){
textView.setText(num + "");
//减法
decrease.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (num > 1) {
num--;
textView.setText(num + "");
} else {
Toast.makeText(v.getContext(), "数量最低为1份", Toast.LENGTH_SHORT).show();
textView.setText("1");
}
}
});
//加法
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
num++;
textView.setText(num + "");
}
});
}
}