我正在自定义ListView中加载手机通讯录。每行都是一个可检查的LinearLayout,包含CheckedTextView和另一个TextView。
我正在使用自定义ArrayAdapter提供列表视图。我的问题是我无法在getView()中控制CheckedTextViews。例如,当我尝试以下
时public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
if(row == null){
row = inflater.inflate(layout, parent, false);
}
CheckedTextView checkedTextView = (CheckedTextView) row.findViewById(R.id.checkedTextView);
checkedTextView.setText("A");
checkedTextView.setChecked(true);
return row;
}
每当我滚动列表视图时,应该检查每个文本视图,但这不会发生。谁能告诉我怎么做?
编辑:在getView()里面检查一下很重要,我不能在setListAdapter()之后检查所有内容EDIT2:这是显示每行视图的xml文件
<?xml version="1.0" encoding="utf-8"?>
<com.example.multiplecontacts.CheckableLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<CheckedTextView
android:id="@+id/checkedTextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:paddingBottom="0dp"
android:text="CheckedTextView"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/subTextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Small Text"
android:paddingTop="0dp"
android:textAppearance="?android:attr/textAppearanceSmall" />
</com.example.multiplecontacts.CheckableLinearLayout>
CheckableLinearLayout是一个自定义布局,它扩展了LinearLayout并实现了Checkable,如前所述。我是从here
取的答案 0 :(得分:29)
您是否在布局xml中为CheckedTextView设置了checkMark属性?
例如:android:checkMark="?android:attr/listChoiceIndicatorMultiple
CheckedTextView不仅仅是一个带文字的复选框。你还必须注意,CheckedTextView不是可聚焦的,或者没有一些操作就可以点击(因为它是为ListView设计的,因此它的状态必须由ListView的setOnItemClickListener
控制)
setChoiceMode
。
检查适配器getView中的行应该通过:listView.setItemChecked(position, value)
答案 1 :(得分:3)
@ Pier-Luc Gendreau和@fox在评论中提到了解决方案,但没有回答,所以代表他们发布了答案。
如@AlexOrlov所述,CheckedTextView无法调焦,或者无需操作即可点击。所以你需要做的是使用ListView设置项目检查,你可以从适配器本身或从你有ListView的activity / fragment中做到。
从适配器
执行此操作public View getView(int position, View convertView, ViewGroup parent)
{
if (//logic) {
((ListView) parent).setItemChecked(position, true);
}
}
来自活动/片段
if (//logic) {
listView.setItemChecked(position, true);
}
答案 2 :(得分:1)
每次滚动列表时,每次调用其getview()方法。因此,如果您在listcell中有任何复选框或任何编辑框,它将重新初始化它。
我的想法是存储复选框的状态(已选中或未选中)。所以在这里我首先使用了ArrayList,然后将其填充为false值,然后在其用于存储实际状态的click事件中。
class MyAdapter extends BaseAdapter implements OnClickListener {
private ArrayList<Boolean> checks=new ArrayList<Boolean>();//Boolean type array to manage check box
private static LayoutInflater inflater=null;
public MyAdapter(Context context, ArrayList<HashMap<String, String>> d)
{
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//fill with false values
for (int i = 0; i < d.size(); i++)
{
checks.add(i, false);
}
}
public int getCount()
{
return data.size();
}
public Object getItem(int position)
{
return position;
}
public long getItemId(int position)
{
return position;
}
public View getView(int position, View convertView, ViewGroup parent)
{
View vi=convertView;
if(convertView==null)
vi = inflater.inflate(R.layout.<your layout>, null);
//Checkbox is of button type----android:button="@drawable/btn_check"
//make a selector xml for checkbox
checkBox=(CheckBox)vi.findViewById(R.id.check_box);
checkBox.setTag(Integer.valueOf(position));
checkBox.setOnClickListener(this);
checkBox.setChecked(checks.get(position));
return vi;
}
@Override
public void onClick(View v)
{
int viewId=v.getId();
if(viewId== R.id.check_box)
{
Integer index = (Integer)v.getTag();
boolean state = checks.get(index.intValue());
checks.set(index.intValue(), !state);
}
}
}
更新:解决方案第二:您可以在ViewHolder类中放置一个布尔变量。这个布尔变量将用于定义是否选择了更好的项目。
希望这对你有所帮助。