2013-05-19 36 views
1

我想要一个listView与一些项目,并且可以检查所有项目。但是如果第一个项目没有被选中,那么另一个项目没有被启用,当然,他们当时不应该被检查。 所以我的ListView扩展到MyListView这样的:为什么禁用的项目仍然可以在列表视图中检查

public class MyListView extends ListView { 

public MyListView(Context context) { 
    super(context); 
    Init(); 
} 

public MyListView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    Init(); 
} 

public MyListView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    Init(); 
} 

private void Init() { 
    setAdapter(new ArrayAdapter<String>(getContext(), android.R.layout.simple_list_item_multiple_choice,array)); 
    setChoiceMode(CHOICE_MODE_MULTIPLE); 

    setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, 
       long id) { 

      SparseBooleanArray posArray = getCheckedItemPositions(); 
      boolean bChecked = false; 
      if(null != posArray) { 
       for(int i = 0; i < posArray.size(); i++) { 
        int nIdx = posArray.keyAt(i); 
        if(nIdx == 0) { 
         bChecked = posArray.get(nIdx); 
         break; 
        } 
       } 
      } 

      if(position == 0) { 
       bChecked = !bChecked; 

       for(int i = 1; i < array.length; i++) { 
        getChildAt(i).setEnabled(!bChecked); 
       } 
      } 
     } 
    }); 
} 

private String[] array = { "Test1", "Test2", "Test3", "Test4" }; 

}

,然后我得到了这个问题:禁用的项目仍然是可检查的,有什么不对?我应该怎么做? 谢谢。


其实这个问题是由pawan yadav的建议完成的。贝娄是我的代码,希望帮助任何人遇到同样的问题。

activity_main.xml中:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/parentLayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".MainActivity" > 

</RelativeLayout> 

在活动的onCreate方法:

ListView listView = new ListView(this); 
String [] datas = new String[36]; // generate you data here 
final boolean [] status = new boolean[36]; // generate you check status here 

final MyAdapter adapter = new MyAdapter(datas, status); 
listView.setAdapter(adapter); 

listView.setOnItemClickListener(new OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, 
      long id) { 
     if(position== 0 || status[0]) { 
      status[position] = !status[positioin]; 
      adapter.notifyDataSetChanged(); 
     } 
    } 
}); 
RelativeLayout parentLayout = (RelativeLayout)findViewById(R.id.parentLayout); 
parentLayout.addView(listView); 

listview_checkedtextview.xml:

<?xml version="1.0" encoding="utf-8"?> 
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    android:layout_width="match_parent" 
    android:layout_height="?android:attr/listPreferredItemHeightSmall" 
    android:textAppearance="?android:attr/textAppearanceListItemSmall" 
    android:gravity="center_vertical" 
    android:checkMark="?android:attr/listChoiceIndicatorMultiple" 
    android:paddingStart="?android:attr/listPreferredItemPaddingStart" 
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" 
/> 

活动的内部类:

private class MyAdapter extends BaseAdapter{ 
public MyAdapter(final String [] datas, final boolean [] status) { 
    this.datas = datas; 
    this.status = status; 
    inflater = LayoutInflater.from(MainActivity.this); 
} 

@Override 
public int getCount() { 
    return datas.length; 
} 

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

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

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if(null == convertView) { 
     convertView = inflater.inflate(R.layout.listview_checkedtextview, null); 
     convertView = convertView.findViewById(R.id.text1); 
    } 

    CheckedTextView checkedTextView = (CheckedTextView) convertView; 
    checkedTextView.setText(datas[position]); 
    checkedTextView.setChecked(status[position]); 
    checkedTextView.setEnabled(position == 0 ? true : status[0]); 

    return convertView; 
} 

private String [] datas; 
private boolean [] status; 
private LayoutInflater inflater; 
} 
+0

为你解答你应该实现适配器 –

+0

致谢getview(),我会尝试。 – xuqiang

回答

3

需要调用setClickable(boolean),使其不能点击,而不是setEnabled(boolean)

+0

太棒了!有用。谢谢! – xuqiang

相关问题