2017-06-19 38 views
0

當我單擊複選框(或選擇項目)通過ListView時,我有一個奇怪的錯誤。checkbox在列表視圖中的onclick()錯誤

由於我的自定義基礎適配器我想執行setItemChecked()每次複選框被選中或不。

第一次點擊什麼也不做(看起來好像沒有點擊),但是我檢查了onclick()是否被觸發,它是否被觸發。所以它只是看起來沒有點擊。

第二次點擊很明顯,第三次也是如此。

但是,然後重新啓動,下一次點擊不會改變複選框的外觀。

而且,如果我在「點擊階段」複選框中的一個點擊其他複選框不會表現得像他們應該做的..

這裏是我的BaseAdapter類與功能的重要摘錄:

final int finalPosition = position; 

checkbox.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View arg0) { 
     if (((CheckBox) arg0).isChecked()) { 
      ((ListView)parent).setItemChecked(finalPosition, true); 
     } else { 
      ((ListView)parent).setItemChecked(finalPosition, false); 
     } 
    } 
}); 

convertView.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     checkbox.toggle(); 
     if (checkbox.isChecked()) { 
      ((ListView)parent).setItemChecked(finalPosition, true); 
     } else { 
      ((ListView)parent).setItemChecked(finalPosition, false); 
     } 
    } 
}); 

這是全班同學:

public class ShoppingListBaseAdapter extends BaseAdapter { 
private ArrayList<ShoppingListEntry> m_itemList; 
private Context m_context; 
private LayoutInflater m_inflater; 

public ShoppingListBaseAdapter(Context context, ArrayList<ShoppingListEntry> shoppingListEntryArrayList) { 
    m_itemList = shoppingListEntryArrayList; 
    m_context = context; 
    m_inflater = (LayoutInflater.from(context)); 
} 

@Override 
public int getCount() { 
    return m_itemList.size(); 
} 

@Override 
public Object getItem(int position) { 
    return null; 
} 

@Override 
public long getItemId(int position) { 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, final ViewGroup parent) { 
    convertView = m_inflater.inflate(R.layout.list_row, null); 

    TextView title = (TextView) convertView.findViewById(R.id.txt_title); 
    TextView info = (TextView) convertView.findViewById(R.id.txt_info); 
    final CheckBox checkbox = (CheckBox) convertView.findViewById(R.id.checkbox1); 

    String itemTitle; 
    String productBrand = m_itemList.get(position).getProductBrand().toString(); 
    if (!productBrand.isEmpty()) { 
     itemTitle = productBrand + " " + m_itemList.get(position).getProductName().toString(); 
    } else { 
     itemTitle = m_itemList.get(position).getProductName().toString(); 
    } 
    title.setText(itemTitle); 

    String itemInfo; 
    String productAmount = m_itemList.get(position).getProductAmount(); 
    float productPrice = m_itemList.get(position).getProductPrice(); 
    itemInfo = productAmount + ", " + productPrice + "€"; 
    info.setText(itemInfo); 

    final int finalPosition = position; 

    checkbox.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      if (((CheckBox) arg0).isChecked()) { 
       ((ListView)parent).setItemChecked(finalPosition, true); 
      } else { 
       ((ListView)parent).setItemChecked(finalPosition, false); 
      } 
     } 
    }); 

    convertView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      checkbox.toggle(); 
      if (checkbox.isChecked()) { 
       ((ListView)parent).setItemChecked(finalPosition, true); 
      } else { 
       ((ListView)parent).setItemChecked(finalPosition, false); 
      } 

     } 
    }); 


    return convertView; 
} 

我在做什麼錯?

回答

1

使用setOnCheckChange相反,像這樣:

checkbox.setOnCheckedChangeListener.setOnCheckedChangeListener(null); 

//if true, your checkbox will be selected, else unselected 
      checkbox.setOnCheckedChangeListener.setChecked(item.isSelected()); 

checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

      }); 
在當你要設置其狀態(選中與否)你的聽衆不會打電話,之後會通過改變其狀態被稱爲這樣

, 只是測試它,讓我知道結果

+0

感謝您的快速答案! 我也試過這種可能性,但不幸的是,有相同的行爲。 除此之外,我不具備的功能'checkbox.setOnCheckedChangeListener.setOnCheckedChangeListener(NULL);'和'checkbox.setOnCheckedChangeListener.setChecked(item.isSelected());' 我只有'checkbox.setOnCheckedChangeListener()' –

+0

哦,我會測試你的代碼找到問題 – Meikiem

+0

我不知道,但現在它工作完美.. 我剛剛改變了'getItem(int位置){返回m_itemList.get(位置);}'和'getItemID( int position){return position;}'函數 –