Java Android-如何在自定义listview下获取所有儿童,即使我们执行滚动
我有一个带有复选框imageview和textview的自定义listview适配器。在我的主布局中(不在listview中),我还有一个按钮和一个复选框(用于全选) 这里我想做的是,当我选中主布局的复选框时,立即选中所有这些listview复选框。我想动态获取相关的textview id 我尝试了一些使用getChaildAT(i)的技术。但是它不能与我的代码一起工作。通过这个,我可以只选中/取消选中特定可见的复选框组。当向下滚动以列出它时,它失败了 我的目标是选中/取消选中所有复选框,即使使用scroll,也可以获取相关id。因此,请提供任何其他方法来获取自定义列表视图中的所有子项计数 在主活动中,我有如下自定义适配器代码Java Android-如何在自定义listview下获取所有儿童,即使我们执行滚动,java,android,Java,Android,我有一个带有复选框imageview和textview的自定义listview适配器。在我的主布局中(不在listview中),我还有一个按钮和一个复选框(用于全选) 这里我想做的是,当我选中主布局的复选框时,立即选中所有这些listview复选框。我想动态获取相关的textview id 我尝试了一些使用getChaildAT(i)的技术。但是它不能与我的代码一起工作。通过这个,我可以只选中/取消选中特定可见的复选框组。当向下滚动以列出它时,它失败了 我的目标是选中/取消选中所有复选框,即使使
filterlist.setAdapter(new CustomAdptr(this));
class CustomAdptr extends ArrayAdapter {
Activity context;
String[] eventtypename;
CustomAdptr(Activity context) {
super(context, android.R.layout.simple_list_item_multiple_choice, filterListdata);
rowView.clear();
this.context = context;
}
public View getView(final int position, View convertView, ViewGroup parent) {
View viewrow = convertView;
if (viewrow == null) {
LayoutInflater inflater = context.getLayoutInflater();
viewrow = inflater.inflate(R.layout.filterlistrow, null);
}
ImageView iw = (ImageView)viewrow.findViewById(R.id.img);
try {
String image = filterListdata.get(position).getFilterImg();
byte[] imbbyte = com.cincinnati.parks.Base64.decode(image);;
Bitmap bmp=BitmapFactory.decodeByteArray(imbbyte,0,imbbyte.length);
iw.setImageBitmap(bmp);
}catch (Exception e) {
e.printStackTrace();
}
TextView tv = (TextView)viewrow.findViewById(R.id.title);
tv.setText(filterListdata.get(position).getFilterImageName());
final CheckBox chkbx = (CheckBox)viewrow.findViewById(R.id.checkbox);
chkbx.setChecked(true);
TextView selectedid = (TextView)viewrow.findViewById(R.id.rid);
selectedid.setText(String.valueOf(filterListdata.get(position).getFilterImgId()));
rowView.add(viewrow);
viewrow.setClickable(true);
viewrow.setFocusable(true);
checkboxImagelist.clear();
for(int i=0;i<filterListdata.size();i++) {
checkboxImagelist.add(filterListdata.get(i).getFilterImgId());
}
chkbx.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (chkbx.isChecked()) {
FilterImageId.clear();
checkboxImagelistall.clear();
topOkbuttongray.setVisibility(4);
topOkbutton.setVisibility(0);
rb = (CheckBox) v;
FilterImageId.add(filterListdata.get(position).getFilterImgId());
checkboxImagelist.addAll(FilterImageId);
checkboxImagelistall.addAll(FilterImageId);
}else {
FilterImageId.clear();
FilterImageId.add(filterListdata.get(position).getFilterImgId());
checkboxImagelistall.remove(FilterImageId);
checkboxImagelist.removeAll(FilterImageId);
if((checkboxImagelist.size()) == 0){
topOkbuttongray.setVisibility(0);
topOkbutton.setVisibility(4);
}
if (filterListdata.size() != checkboxImagelist.size()) all.setChecked(false);
}
if (filterListdata.size() == heckboxImagelist.size()) all.setChecked(true);
}
});
return (viewrow);
}
}
filterlist.setAdapter(新的CustomAdptr(this));
类CustomAdptr扩展了ArrayAdapter{
活动语境;
字符串[]eventtypename;
CustomAdptr(活动上下文){
super(上下文、android.R.layout.simple\u list\u item\u多选、filterListdata);
rowView.clear();
this.context=上下文;
}
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视图视图行=转换视图;
如果(viewrow==null){
LayoutInflater充气器=上下文。getLayoutInflater();
viewrow=充气机。充气(R.layout.filterlistrow,null);
}
ImageView iw=(ImageView)viewrow.findViewById(R.id.img);
试一试{
字符串image=filterListdata.get(position.getFilterImg();
byte[]imbbyte=com.cincinnati.parks.Base64.decode(image);;
位图bmp=BitmapFactory.decodeByteArray(imbbyte,0,imbbyte.length);
设置图像位图(bmp);
}捕获(例外e){
e、 printStackTrace();
}
TextView tv=(TextView)viewrow.findViewById(R.id.title);
tv.setText(filterListdata.get(position.getFilterImageName());
最终复选框chkbx=(复选框)viewrow.findViewById(R.id.CheckBox);
chkbx.setChecked(真);
TextView selectedid=(TextView)viewrow.findViewById(R.id.rid);
选择edid.setText(String.valueOf(filterListdata.get(position.getFilterImgId());
添加(视图行);
viewrow.setClickable(真);
viewrow.setFocusable(真);
checkboxImagelist.clear();
对于(int i=0;i来说,除了在适配器项下面的数据中存储状态之外,没有其他方法可以做到这一点,因为列表视图中的可回收项的数量实际上是有限的,它明显小于可能的数据项数量
因此,我的建议是要么存储一个与filterListdata中的项对应的布尔值数组列表,要么将布尔值添加到filterListdata中存储的项中。然后在getView()中,根据项的布尔值选中标志设置复选框的选中状态。
这样,当您需要选中ListView中的所有复选框时,您可以运行所有项目并将所有选中标志设置为true,然后调用notifyDataSetChanged()来更新可见项目。当然,您还必须在OnClickListener for复选框中设置选中标志
不过,我不确定获取项目ID是什么意思。同样,您可以遍历数据数组,并知道每个项目是否已检查
更多评论:
- 考虑使用OnCheckedChangeListener和相应的setter,而不是OnClickListener for复选框
- 考虑对所有复选框只使用一个侦听器实例。现在,您正在为每个项目创建一个新的侦听器实例。如果用户想要快速滚动列表,应用程序将不得不在过程中创建大量无用的新对象,这将阻塞GC(它必须不断执行垃圾收集)整个体验将非常厚重
- 使用模式避免在每次需要显示新项目时创建位图。这也可能是一个巨大的性能瓶颈
将所有复选框标记为true/false后,调用列表中的invalidate();
。这将刷新列表中设置了最新属性的所有元素(可见或不可见)
试试看
OnClickListener radio_listener = new OnClickListener() {
public void onClick(View v) {
int Id;
System.out.println("enter set all button");
rb = (CheckBox) v;
if(rb.isChecked()) {
System.out.println("enter set all button rb.isChecked()");
topOkbutton.setVisibility(0);
topOkbuttongray.setVisibility(4);
checkboxImagelistall.clear();
checkboxImagelist.clear();
//markAll(true);
for(int i=0;i<filterListdata.size();i++) {
Id = filterListdata.get(i).getFilterImgId();
checkboxImagelistall.add(Id);
checkboxImagelist.add(Id);
}
System.out.println("In enable condition filterlist.getChildCount()============="+filterlist.getChildCount());
System.out.println("In enable condition filterlist.getAdapter().getCount()============="+filterlist.getAdapter().getCount());
/*for(int i=0; i < filterlist.getAdapter().getCount(); i++){*/
for(int i=0; i < filterlist.getChildCount(); i++){
LinearLayout itemLayout = (LinearLayout)filterlist.getChildAt(i);
CheckBox cb = (CheckBox)itemLayout.findViewById(R.id.checkbox);
//CheckBox cb = (CheckBox)filterlist.getAdapter().getView(i, null, null);
cb.setChecked(true);
TextView tv = (TextView)filterlist.getChildAt(i).findViewById(R.id.rid);
rowIdstr.add(tv.getText().toString());
}
}else {
System.out.println("enter set all button rb.isChecked() Not");
all.setChecked(false);
rb.setChecked(false);
topOkbutton.setVisibility(4);
topOkbuttongray.setVisibility(0);
System.out.println("In disable condition filterlist.getChildCount()============="+filterlist.getChildCount());
System.out.println("In disable condition filterlist.getAdapter().getCount()============="+filterlist.getAdapter().getCount());
//markAll(false);
for(int i=0; i < filterlist.getChildCount(); i++){
//CheckBox cb = (CheckBox)filterlist.getAdapter().getView(i, null, null);
LinearLayout itemLayout = (LinearLayout)filterlist.getChildAt(i);
CheckBox cb = (CheckBox)itemLayout.findViewById(R.id.checkbox);
cb.setChecked(false);
rowIdstr.clear();
checkboxImagelistall.clear();
}
}
}
};
all.setOnClickListener(radio_listener);
<CheckBox android:id="@+id/radioselectall"
android:layout_width="30dp" android:layout_height="20dp"
android:layout_marginLeft="10dp" android:layout_marginTop="4dp"
android:layout_marginRight="10dp" android:checked="true" />
<ListView
android:id="@+id/listm"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginLeft="10dp" />
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="left"
>
<CheckBox
android:layout_width="40dp"
android:scaleType="centerCrop"
android:id="@+id/checkbox"
android:layout_height="40dp"
android:layout_marginTop="4dp"
android:checked="true"/>
<ImageView
android:id="@+id/img"
android:scaleType="centerCrop"
android:layout_marginLeft="30dp"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="left"/>
<TextView
android:layout_width="150dp"
android:scaleType="centerCrop"
android:id="@+id/title"
android:layout_height="fill_parent"
android:textStyle="normal"
android:layout_marginTop="2dp"
android:layout_marginLeft="30dp"
android:textColor="@color/white"
android:textSize="15sp"
/>
<TextView
android:layout_width="wrap_content"
android:id="@+id/rid"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textSize="16sp"
android:visibility="invisible"
/>
</LinearLayout>