2017-06-19 4 views
0

チェックボックス(またはアイテムの選択)をクリックしてListViewをクリックすると、私は奇妙なバグがあります。チェックボックスリストビューのonclick()バグ

私のカスタムベースアダプタのため、チェックボックスがオンになっているかどうかにかかわらず、setItemChecked()を実行します。

最初のクリックは何もしません(クリックされていないように見えます)。しかし、onclick()が起動されたかどうかを確認しました。だからそれはちょうどクリックされていない見えた。

2回目のクリックは明らかに機能し、3番目のクリックも同様に機能します。

しかし、それが再開し、次のクリックでチェックボックスの外観が変わることはありません。

:私は、彼らがすべきのようにここで

は機能を持つ私の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.setChecked(item.isSelected()); ' 私は' checkbox.setOnCheckedChangeListener(持っている) ' –

+0

ああ、私は、関数' checkbox.setOnCheckedChangeListener.setOnCheckedChangeListener(null)を持っていけないことに加えて 私は問題を見つけるためにコードをテストします – Meikiem

+0

私は考えていませんが、今は完全に働いています.. 私は 'getItem(int position){return m_itemList.get(position);}'と 'getItemID( int position){return position;} 'functions –