我正在为listview的每个Iten实现带有listview的复选框。我得到的问题是当我点击任何一个复选框时,其他一些未被点击的复选框也被随机点击。
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View vi = convertView;
final int as=position;
if (convertView == null) { // if it's not recycled, initialize some
// attributes
LayoutInflater inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
vi = inflater.inflate(R.layout.grid_item, null);
holder = new ViewHolder();
holder.textheader = (TextView) vi.findViewById(R.id.item1);
holder.textcpu = (TextView) vi.findViewById(R.id.item2);
holder.text_modified_date = (TextView) vi.findViewById(R.id.item4);
holder.text_cpu = (TextView) vi.findViewById(R.id.item3);
holder.text_checkbox=(CheckBox)vi.findViewById(R.id.checkBox1);
vi.setTag(holder);
holder.text_checkbox.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (holder.text_checkbox.isClickable()) {
itemChecked.set(as, true);
packages=as;
} else if (!holder.text_checkbox.isClickable()) {
itemChecked.set(as, false);
}
String packag=app_package.get(as);
Log.d("package listttttttttt", packag);
}
});
} else {
holder = (ViewHolder) vi.getTag();
}
答案 0 :(得分:3)
尝试以下代码
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View vi = convertView;
final int as=position;
if (convertView == null) { // if it's not recycled, initialize some
// attributes
LayoutInflater inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
vi = inflater.inflate(R.layout.grid_item, null);
holder = new ViewHolder();
holder.textheader = (TextView) vi.findViewById(R.id.item1);
holder.textcpu = (TextView) vi.findViewById(R.id.item2);
holder.text_modified_date = (TextView) vi.findViewById(R.id.item4);
holder.text_cpu = (TextView) vi.findViewById(R.id.item3);
holder.text_checkbox=(CheckBox)vi.findViewById(R.id.checkBox1);
vi.setTag(holder);
} else {
holder = (ViewHolder) vi.getTag();
}
holder.text_checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if(isChecked)
{
// do your stuff
itemChecked.set(as, true);
packages=as;
}
else
{
// do your stuff
itemChecked.set(as, false);
}
}
});
if(itemChecked.size() != 0 && itemChecked.get(position))
holder.text_checkbox.setChecked(true);
else
holder.text_checkbox.setChecked(false);
答案 1 :(得分:1)
问题是您的getView()
方法无法正确处理视图。您必须设置新视图的状态并更新回收视图的状态。此外,您还必须定义视图的行为。 SO上有很多线程有类似的问题。我认为this one可以帮助您(它包含工作代码)。
您的代码应如下所示:
public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;
final int as=position;
if (convertView == null) { // no view passed, create one
LayoutInflater inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
vi = inflater.inflate(R.layout.grid_item, null);
// Setup the View content
holder = new ViewHolder();
holder.textheader = (TextView) vi.findViewById(R.id.item1);
holder.textcpu = (TextView) vi.findViewById(R.id.item2);
holder.text_modified_date = (TextView) vi.findViewById(R.id.item4);
holder.text_cpu = (TextView) vi.findViewById(R.id.item3);
holder.text_checkbox=(CheckBox)vi.findViewById(R.id.checkBox1);
// Do your checkbox initial setup here.
holder.text_checkbox.setChecked(getBooleanFromPosition(position));
vi.setTag(holder);
// Setup the View behavior
holder.text_checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
// Do your stuff here
});
} else {
// Update your View state
holder = (ViewHolder) vi.getTag();
holder.text_checkbox.setChecked(getBooleanFromPosition(position));
}
显然,您必须将复选框的状态存储在某些数据结构中,例如布尔数组并读取该数据结构,以便知道是否选中/取消选中给定位置的复选框(读取访问权限是应该getBooleanFromPosition
。并且应该在控制View
行为的部分中更新该数据结构。
答案 2 :(得分:1)
问题在于,您不允许将焦点项与列表视图结合使用,但有一种解决方法:
如果您使用XML布局作为列表项,请将checkboxable focus属性设置为false:
android:focusable="false"
这也应该使列表项也可以点击。
我希望这能解决你的问题。请告诉我它是怎么回事。