綁定帳號登入

Android 台灣中文網

打印 上一主題 下一主題

[求助] ListView自訂Adapter內的Button顯示問題

[複製連結] 查看: 1149|回覆: 4|好評: 0
跳轉到指定樓層
樓主
g198507 | 收聽TA | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
發表於 2016-3-30 09:11

馬上加入Android 台灣中文網,立即免費下載應用遊戲。

您需要 登錄 才可以下載或查看,沒有帳號?註冊

x
本帖最後由 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.     }
複製代碼
「用Android 就來APK.TW」,快來加入粉絲吧!
Android 台灣中文網(APK.TW)
收藏收藏1 分享分享 分享專題
用Android 就來Android 台灣中文網(https://apk.tw)
回覆

使用道具 舉報

沙發
ploglin | 收聽TA | 只看該作者
發表於 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.         }
複製代碼
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

板凳
 樓主| g198507 | 收聽TA | 只看該作者
發表於 2016-3-30 10:18
謝謝指導~

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

用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

地板
jasononlie | 收聽TA | 只看該作者
發表於 2016-4-11 17:11
據我的經驗,viewTag.btnDone.setVisibility(View.GONE); position會因為滑動而跑掉
使用View.INVISIBLE吧,如果邏輯沒問題
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

5
ploglin | 收聽TA | 只看該作者
發表於 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 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則