Java Android-如何在自定义listview下获取所有儿童,即使我们执行滚动

Java Android-如何在自定义listview下获取所有儿童,即使我们执行滚动,java,android,Java,Android,我有一个带有复选框imageview和textview的自定义listview适配器。在我的主布局中(不在listview中),我还有一个按钮和一个复选框(用于全选) 这里我想做的是,当我选中主布局的复选框时,立即选中所有这些listview复选框。我想动态获取相关的textview id 我尝试了一些使用getChaildAT(i)的技术。但是它不能与我的代码一起工作。通过这个,我可以只选中/取消选中特定可见的复选框组。当向下滚动以列出它时,它失败了 我的目标是选中/取消选中所有复选框,即使使

我有一个带有复选框imageview和textview的自定义listview适配器。在我的主布局中(不在listview中),我还有一个按钮和一个复选框(用于全选)

这里我想做的是,当我选中主布局的复选框时,立即选中所有这些listview复选框。我想动态获取相关的textview id

我尝试了一些使用getChaildAT(i)的技术。但是它不能与我的代码一起工作。通过这个,我可以只选中/取消选中特定可见的复选框组。当向下滚动以列出它时,它失败了

我的目标是选中/取消选中所有复选框,即使使用scroll,也可以获取相关id。因此,请提供任何其他方法来获取自定义列表视图中的所有子项计数

在主活动中,我有如下自定义适配器代码

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>