美團點餐—listview內部按鈕點擊事件

PS:長時間不寫博客了,今天來寫一下美團的這個點餐界面,今天先寫一個加號減號的接口調用,下一篇是總體,有點菜,評價,商家,還有左邊的listview和右邊的展現項。進入這篇正題,像listview,GridView等這些view都有寫好的一些點擊監聽,但有些並非我們想要用到的,好比說listview內部有按鈕,我們要點擊,並且還要在該item項上作一些操做,好比說數字加減並顯示在頁面上,實時顯示。這就用到了今天的內部點擊事件的回調,固然這只是一種方法,也可能有其餘更簡單的方法。今天就主要說一下相似於美團的加減餐數量的回調。java

美團圖:android

這個圖是比較好看的,今天所寫的代碼就不如這個了,主要是說回調ide

步驟佈局

  1. 主佈局裏面只有一個listview控件
  2. item佈局樣式
  3. 自定義適配器的建立
  4. activity中回調方法

1:第一步

主佈局裏添加一個listview,這個就省略了。this

 

2:item佈局樣式

佈局也是簡單的,這裏的加號和減號,我沒有給你們把圖片給你們,隨便一個圖片便可,就算沒有圖片一個btn也是能夠的spa

這裏的左邊一個textview   ,左右分別是加號和減號,還有一個num(textview)顯示。code

<TextView
        android:id="@+id/id_lv_name"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="火腿"
        android:layout_marginLeft="5dp"
        android:layout_gravity="center|left"
        android:textSize="20dp"
        android:layout_weight="0.7"/>
    <ImageView
        android:id="@+id/id_lv_minus"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:src="@drawable/btnminus"
        android:layout_weight="0.1"/>
    <TextView
        android:id="@+id/id_lv_num"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:text="1"
        android:textSize="20dp"
        android:gravity="center"
        android:layout_weight="0.1"/>
    <ImageView
        android:id="@+id/id_lv_add"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:src="@drawable/btnadd"
        android:layout_weight="0.1"/>

3:自定義適配器的建立

這個是關鍵,裏面須要有自定義的接口用做回調。blog

這裏面有一個類Item,就是一個實體類,裏面只有name和num,和setget方法。具體看註釋。接口

3.1首先自定義一個adapter,重寫裏面的一些方法便可,這裏是局部代碼。

public class MyAdapterListView extends BaseAdapter {
    public Context context;
    public List<Item> list;
    private int num1;


    public MyAdapterListView(Context context, List<Item> list) {
        this.context = context;
        this.list = list;
    }

 3.2 主要是getview方法,這裏是又寫了一個ViewHolder類。

public View getView(final int i, View view, ViewGroup viewGroup) {
//        int num=0;
        if(view == null){
            view=LayoutInflater.from(context).inflate(R.layout.lv_item,null);
            viewHolder=new ViewHolder();
            viewHolder.name= (TextView) view.findViewById(R.id.id_lv_name);
            viewHolder.minus= (ImageView) view.findViewById(R.id.id_lv_minus);
            viewHolder.numText= (TextView) view.findViewById(R.id.id_lv_num);
            viewHolder.add= (ImageView) view.findViewById(R.id.id_lv_add);
            view.setTag(viewHolder);
        }
        viewHolder= (ViewHolder) view.getTag();
        viewHolder.name.setText(""+list.get(i).getName());
        viewHolder.numText.setText(""+list.get(i).getNum());

 3.3 重點來了建立接口,這裏定義了一個方法,須要傳入textview控件和  position,和加號(減號)改變的數據。

//定義接口
    public interface OnMyItemClickListener{
        //ID  , 數量
        void onBtnItemListener(TextView tv, int i, int num);
    }
    public OnMyItemClickListener onMyItemClickListener;
    public void setOnMyItemClickListener(OnMyItemClickListener onMyItemClickListener){
        this.onMyItemClickListener=onMyItemClickListener;
    }

  3.4:加號和減號用法// num1 = 0; 加減號 使用接口

 viewHolder.minus.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { num1 = list.get(i).getNum();//獲取到(減號)改動過的 數量 num1 = num1 -1; if(num1 <=0){//邏輯判斷,若是減爲0的話,就一直爲0,要否則就是符號了。 num1 =0; } onMyItemClickListener.onBtnItemListener(viewHolder.numText,i, num1);//使用剛纔自定義的接口。 } }); viewHolder.add.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { num1 = list.get(i).getNum();//獲取到(加號)改動過的 數量

          num1++;
         viewHolder.numText.setText(num1 +""); onMyItemClickListener.onBtnItemListener(viewHolder.numText,i, num1); } });

4:activity中回調方法

主要仍是調用Adapter中建立的接口,而後使用的時候再獲取改變的num值,而後經過listData.get(i).setNum(num)修改該id的數據,而後讓適配器更新一下。
Item item;
        for (int i = 0; i < 30; i++) {
            item = new Item();
            item.setName("ceshi" + i);
            item.setNum(0);
            listData.add(item);
        }
        myAdapterListView = new MyAdapterListView(this, listData);
        listview.setAdapter(myAdapterListView);//接口回調adapter中的方法,修改值之後再返回數據,更新適配器
        myAdapterListView.setOnMyItemClickListener(new MyAdapterListView.OnMyItemClickListener() {
            @Override
            public void onBtnItemListener(TextView tv, int i, int num) {
//                Toast.makeText(MainActivity.this, "第:"+i+" 個---"+num, Toast.LENGTH_SHORT).show();
                listData.get(i).setNum(num);
                myAdapterListView.notifyDataSetChanged();
            }
        });

  

完。  事件

相關文章
相關標籤/搜索