Android 台灣中文網

標題: ListView自訂Adapter內的Button顯示問題 [打印本頁]

作者: g198507    時間: 2016-3-30 09:11
標題: ListView自訂Adapter內的Button顯示問題
本帖最後由 g198507 於 2016-3-30 09:11 編輯

目前遇到一個問題是寫類似成就達成的清單欄位(共有7個欄位),正常情況下6個欄位按鈕都必須是隱藏(第7個按鈕在6個全完成才會顯示),只要其中一個有完成,按鈕才會各別顯示。
但現在只要2~6其中一個有顯示,第一個按鈕就會跟著顯示;消失就跟著消失。
請教下面程式碼邏輯哪邊出錯?

非常感謝指導~



  1. @Override
  2.     public View getView(final int position, View convertView, ViewGroup parent) {

  3.         if (convertView == null) {
  4.             LayoutInflater inflater = mainActivity.getLayoutInflater();
  5.             convertView = inflater.inflate(R.layout.collection_list, null);

  6.             viewTag = new ViewTag((Button) convertView.findViewById(R.id.collect_btn_done),
  7.                     (ImageView) convertView.findViewById(R.id.collect_imgLogo),
  8.                     (TextView) convertView.findViewById(R.id.collect_txtDetail),
  9.                     (TextView) convertView.findViewById(R.id.collect_txtName));
  10.             convertView.setTag(viewTag);
  11.         } else {
  12.             viewTag = (ViewTag) convertView.getTag();
  13.         }

  14.         //判斷若有收藏品,則顯示按鈕
  15.         if (position < MainActivity.aryTitle.size() - 1) {    //判斷0~6按鈕
  16.             if (MainActivity.aryCollectionItem.get(position).isGet() && MainActivity.aryCollectionItemForAdapter.get(position).isGet()) { //如果有拿到收藏品
  17.                 viewTag.btnDone.setVisibility(View.VISIBLE);
  18.             }
  19.         } else {
  20.             boolean yet = true;    //如果有全部收集為true
  21.             for (int i = 0; i < MainActivity.aryTitle.size() - 1; i++) {
  22.                 if (!MainActivity.aryCollectionItem.get(i).isGet()) {     //如果有一個沒收集到
  23.                     yet = false;
  24.                 }
  25.             }
  26.             if (yet) {    //如果全收集到
  27.                 viewTag.btnDone.setVisibility(View.VISIBLE);
  28.             }
  29.         }
  30.         viewTag.btnDone.setOnClickListener(new ItemButton_Click(mainActivity, position));
  31.         viewTag.imageView.setImageResource(MainActivity.aryImg.get(position));
  32.         viewTag.txtName.setText(MainActivity.aryTitle.get(position));
  33.         viewTag.txtDetail.setText(MainActivity.aryDetail.get(position));
  34.         return convertView;
  35.     }
複製代碼

作者: ploglin    時間: 2016-3-30 09:40
因為 ListView 在呈現的時候,會不斷的去實作 getView 的事件,初步猜測應該是判斷式的問題,建議你可以先試看看


  1. //判斷若有收藏品,則顯示按鈕
  2.         if (position < MainActivity.aryTitle.size() - 1) {    //判斷0~6按鈕
  3.             if (MainActivity.aryCollectionItem.get(position).isGet() && MainActivity.aryCollectionItemForAdapter.get(position).isGet()) { //如果有拿到收藏品
  4.                 viewTag.btnDone.setVisibility(View.VISIBLE);
  5.             } else {
  6.                 viewTag.btnDone.setVisibility(View.GONE);
  7.             }
  8.         } else {
  9.             boolean yet = true;    //如果有全部收集為true
  10.             for (int i = 0; i < MainActivity.aryTitle.size() - 1; i++) {
  11.                 if (!MainActivity.aryCollectionItem.get(i).isGet()) {     //如果有一個沒收集到
  12.                     yet = false;
  13.                 }
  14.             }
  15.             if (yet) {    //如果全收集到
  16.                 viewTag.btnDone.setVisibility(View.VISIBLE);
  17.             } else {
  18.                 viewTag.btnDone.setVisibility(View.GONE);
  19.             }
  20.         }
複製代碼

作者: g198507    時間: 2016-3-30 10:18
謝謝指導~

在DeBug模式執行程式確認後,getView會實作3次進行判斷,position共有0~7。
設定position = 2 為顯示,判斷會跳入VISIBLE
確認position=0 (第一個按鈕),都沒有跳入VISIBLE,但最後UI 第一個按鈕還是顯示出來了


作者: jasononlie    時間: 2016-4-11 17:11
據我的經驗,viewTag.btnDone.setVisibility(View.GONE); position會因為滑動而跑掉
使用View.INVISIBLE吧,如果邏輯沒問題
作者: ploglin    時間: 2016-4-18 09:18
如果還是有問題的話,不然你先不要用有cache的方式,把

  1. if (convertView == null) {
  2.             LayoutInflater inflater = mainActivity.getLayoutInflater();
  3.             convertView = inflater.inflate(R.layout.collection_list, null);

  4.             viewTag = new ViewTag((Button) convertView.findViewById(R.id.collect_btn_done),
  5.                     (ImageView) convertView.findViewById(R.id.collect_imgLogo),
  6.                     (TextView) convertView.findViewById(R.id.collect_txtDetail),
  7.                     (TextView) convertView.findViewById(R.id.collect_txtName));
  8.             convertView.setTag(viewTag);
  9.         } else {
  10.             viewTag = (ViewTag) convertView.getTag();
  11.         }
複製代碼


改成


  1.             LayoutInflater inflater = mainActivity.getLayoutInflater();
  2.             convertView = inflater.inflate(R.layout.collection_list, null);

  3.             viewTag = new ViewTag((Button) convertView.findViewById(R.id.collect_btn_done),
  4.                     (ImageView) convertView.findViewById(R.id.collect_imgLogo),
  5.                     (TextView) convertView.findViewById(R.id.collect_txtDetail),
  6.                     (TextView) convertView.findViewById(R.id.collect_txtName));
  7.             convertView.setTag(viewTag);
複製代碼


強制每一次都重新去產生Layout試試,如果還有問題,就一定是你的邏輯判斷有問題,需要你自己再debug一下




歡迎光臨 Android 台灣中文網 (https://apk.tw/) Powered by Discuz! X3.1