1. 程式人生 > >普通Listview載入列表,最後一行是帶輸入框的顯示問題

普通Listview載入列表,最後一行是帶輸入框的顯示問題

1.定義實體,需要基本的四個欄位

private String text;//普通的
private String customText;//帶輸入框的
private int tag = 1;// 0、帶輸入框,1、不帶輸入框
private boolean isCheck;


1)可以根據設定ischeck來設定選中圖片的顏色

  2)根據定義一個int 型別的值來(或者boolean值) 來判斷他選中的是帶輸入框的還是不帶輸入框的

2.介面卡的設定

1)設定他的檢視層

定義2個型別的檢視,設定一個int值的屬性;例如:1 為普通的   2 為帶輸入框的顯示;

然後在 介面卡獲取不同元件的時候給值。

---設定檢視層有多種方法

第一種:

  return getItem(position).getTitle().indexOf("自定義") > -1 ? 1 : 0;

第二種:

  if (position == getCount() - 1) {
            return 0;
        }
        return 1;


        if (getItemViewType(position) == 0) {
            return R.layout.item_cn_payout_matter_edit;
        }
        return R.layout.item_cn_payout_matter_edit_lable;

2)介面卡賦值的時候

需要給不同的元件根據定義來的賦值,新增帶輸入框的時候設定他的額外的點選事件

if (data.isCheck()) {
    lableViewHolder.checkIv.setImageResource(R.mipmap.ic_selected);
} else {
    lableViewHolder.checkIv.setImageResource(R.mipmap.ic_un_select);
}

以上是是根據ischeck來設定他的選擇圖片的狀態   到最後去關聯檢視到i這邊來設定

⭐⭐⭐⭐⭐⭐⭐

帶輸入框的.setOnTouchListener(new CustomOnTouchListener(position));
帶輸入框的.setOnFocusChangeListener(new CustomOnFocusChangeListener(position));

這裡為自定義的滑動和監聽事件!!!


class CustomTextWatcher implements TextWatcher {
        private int position;


        public CustomTextWatcher(int position) {
            this.position = position;
        }


        public void setPosition(int position) {
            this.position = position;
        }


        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }


        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
        }


        @Override
        public void afterTextChanged(Editable s) {
            getItem(position).setCustomTitle(s.toString());//為輸入的位置內容設定陣列管理器,防止item重用機制導致的上下內容一樣的問題
        }
    }


    class CustomOnTouchListener implements View.OnTouchListener {
        private int position;


        public CustomOnTouchListener(int position) {
            this.position = position;
        }


        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_UP) {
                clickListener.onClick(position);
            }
            return false;
        }
    }


    class CustomOnFocusChangeListener implements View.OnFocusChangeListener {


        private int position;


        public CustomOnFocusChangeListener(int position) {
            this.position = position;
        }


        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            EditText et = (EditText) v;
            if (watcher == null) {
                watcher = new CustomTextWatcher(position);
            }
            if (hasFocus) {
                watcher.setPosition(position);
                et.addTextChangedListener(watcher);//設定edittext內容監聽
            } else {
                et.removeTextChangedListener(watcher);
            }
        }
    }


需要先在前面初始化他的屬性

    private CustomTextWatcher watcher;


    public ClickListener clickListener;


    public void setClickListener(ClickListener clickListener) {
        this.clickListener = clickListener;
    }


在外面定義一個監聽介面

public interface ClickListener {
    public void onClick(Object ... objects);
}




最後在activity或者fragment中進行判斷設定 根據實際情況來定

  adapter.setClickListener(new ClickListener() {
            @Override
            public void onClick(Object... objects) {
                cleanCheck((Integer) objects[0]);
            }
        });


        adapter.addDataList(dataList);
    }

//清空
    private void cleanCheck(int position) {
        for (int i = 0; i < adapter.getCount(); i++) {
            adapter.getItem(i).setCheck(false);
        }
        adapter.getItem(position).setCheck(true);
        adapter.notifyDataSetChanged();
    }