Android 自定义列表适配器-选择所有复选框按钮
我已经实现了一个带有复选框的自定义Listview。用户可以点击listview上的一行,复选框将选中。即使用户滚动,也会存储位置 listview绑定到异步任务的Android 自定义列表适配器-选择所有复选框按钮,android,listview,checkbox,Android,Listview,Checkbox,我已经实现了一个带有复选框的自定义Listview。用户可以点击listview上的一行,复选框将选中。即使用户滚动,也会存储位置 listview绑定到异步任务的onPostExecute中的适配器 protected void onPostExecute(Boolean result) { ImageAdapter adapter = new ImageAdapter(this, pix, paths); lstView.setAdapter(a
onPostExecute
中的适配器
protected void onPostExecute(Boolean result) {
ImageAdapter adapter = new ImageAdapter(this, pix, paths);
lstView.setAdapter(adapter);
}
我可以单击列表项并选中该项的复选框,如下所示:
lstView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long row) {
CheckBox cb = (CheckBox) view.findViewById(R.id.checkBox1);
cb.performClick();
}
lstView.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
public void onItemClick(AdapterView父视图、视图视图、整型位置、长行){
复选框cb=(复选框)view.findViewById(R.id.checkBox1);
cb.performClick();
}
我想介绍一个按钮,它将选中所有复选框
我试过了,但不起作用
mSelectAllButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
CheckBox cb = (CheckBox) v.findViewById(R.id.checkBox1);//find the checkbox in the custom list
int cntChoice = mListView.getCount();
for(int i = 0; i < cntChoice; i++)
{
//if the checkbox is not clicked then click it
if(!mListView.isItemChecked(i))
{
//cb.performClick(); // didnt work
//cb.setChecked(true); // didnt work
}
}
mSelectAllButton.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
复选框cb=(CheckBox)v.findviewbyd(R.id.checkBox1);//在自定义列表中查找该复选框
int cntChoice=mListView.getCount();
for(int i=0;i
有谁能给我解释清楚(我是Android和Java新手)如何更改我的适配器,以及如何在我的主要活动的OnClick侦听器中实现这一点
我是否必须为此创建新的ImageAdapter并将其重新绑定到ListView
谢谢
我的适配器:
public class ImageAdapter extends BaseAdapter {
Context context;
ArrayList<Bitmap> images;
ArrayList folderName;
boolean[] checkBoxState;
public ImageAdapter(Context c, ArrayList<Bitmap> images, ArrayList folderName){
this.context = c;
this.images = images;
this.folderName = folderName;
this.context = context;
checkBoxState=new boolean[images.size()];
imageLoader = ImageLoader.getInstance();
}
public int getCount() {
return images.size();
}
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
private class ViewHolder {
TextView title;
ImageView iconImage;
CheckBox checkbox;
}
public View getView(final int position, View arg1, ViewGroup arg2) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = arg1;
ViewHolder holder;
if (arg1 == null) {
LayoutInflater vi = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.list_row, null);
holder = new ViewHolder();
holder.title = (TextView) v.findViewById(R.id.filename);
holder.iconImage = (ImageView) v.findViewById(R.id.list_image);
holder.checkbox = (CheckBox)v.findViewById(R.id.checkBox1);
v.setTag(holder);
} else {
holder = (ViewHolder) v.getTag();
}
int i = folderName.get(position).toString().lastIndexOf('\\');
if(i!= -1)
{
holder.title.setText(folderName.get(position).toString().substring(i));
}
else
{
holder.title.setText(folderName.get(position).toString());
}
holder.iconImage.setImageBitmap(images.get(position));
holder.checkbox.setChecked(checkBoxState[position]);
holder.checkbox.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if(((CheckBox)v).isChecked())
checkBoxState[position]=true;
else
checkBoxState[position]=false;
}
});
return v;
公共类ImageAdapter扩展了BaseAdapter{
语境;
阵列图像;
ArrayList folderName;
布尔[]checkBoxState;
公共ImageAdapter(上下文c、ArrayList图像、ArrayList文件夹名){
this.context=c;
这个。图像=图像;
this.folderName=folderName;
this.context=上下文;
checkBoxState=new boolean[images.size()];
imageLoader=imageLoader.getInstance();
}
public int getCount(){
返回图像。size();
}
公共对象getItem(int arg0){
//TODO自动生成的方法存根
返回null;
}
公共长getItemId(int arg0){
//TODO自动生成的方法存根
返回0;
}
私有类视窗持有者{
文本视图标题;
图像视图图像;
复选框;
}
公共视图getView(最终整数位置,视图arg1,视图组arg2){
LayoutFlater充气器=(LayoutFlater)上下文
.getSystemService(上下文布局\充气机\服务);
视图v=arg1;
视窗座;
如果(arg1==null){
LayoutInflater vi=(LayoutInflater)上下文
.getSystemService(上下文布局\充气机\服务);
v=vi.充气(R.布局.列表,空);
holder=新的ViewHolder();
holder.title=(TextView)v.findViewById(R.id.filename);
holder.iconImage=(ImageView)v.findViewById(R.id.list\u图像);
holder.checkbox=(checkbox)v.findViewById(R.id.checkBox1);
v、 setTag(支架);
}否则{
holder=(ViewHolder)v.getTag();
}
int i=folderName.get(position.toString().lastIndexOf('\\');
如果(i!=-1)
{
holder.title.setText(folderName.get(position.toString().substring(i));
}
其他的
{
holder.title.setText(folderName.get(position.toString());
}
holder.iconImage.setImageBitmap(images.get(position));
holder.checkbox.setChecked(checkbox状态[位置]);
holder.checkbox.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
如果(((复选框)v).isChecked())
checkBoxState[位置]=真;
其他的
checkBoxState[位置]=假;
}
});
返回v;
首先,您需要向ViewHolder添加一个以上的参数
int id
下面是您的getView()
方法的更新
public View getView(final int position, View arg1, ViewGroup arg2) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = arg1;
final ViewHolder holder;
if (arg1 == null) {
LayoutInflater vi = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.list_row, null);
holder = new ViewHolder();
holder.title = (TextView) v.findViewById(R.id.filename);
holder.iconImage = (ImageView) v.findViewById(R.id.list_image);
holder.checkbox = (CheckBox) v.findViewById(R.id.checkBox1);
v.setTag(holder);
} else {
holder = (ViewHolder) v.getTag();
}
holder.id = position;
int i = folderName.get(position).toString().lastIndexOf('\\');
if (i != -1) {
holder.title.setText(folderName.get(position).toString()
.substring(i));
} else {
holder.title.setText(folderName.get(position).toString());
}
holder.iconImage.setImageBitmap(images.get(position));
holder.checkbox.setChecked(checkBoxState[position]);
holder.checkbox
.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton arg0,
boolean isCheck) {
if (isCheck)
checkBoxState[holder.id] = true;
else
checkBoxState[holder.id] = false;
notifyDataSetChange();
}
});
return v;
}
请尽快告诉我结果首先,您需要将
ImageAdapter
声明为全局变量
其次,您在应用程序中使用了适配器
protected void onPostExecute(Boolean result) {
adapter = new ImageAdapter(this, pix, paths);
lstView.setAdapter(adapter);
}
第三,在ImageAdapter类中再添加一个方法
public void selectedAll() {
for(int i = 0; i< checkBoxState.length; i++){
checkBoxState[i] = true;
}
notifyDataSetChanged();
}
试试这个——我已经看到了,但我不明白(当他们谈论模型的时候)当然我可以解释。首先你能发布你的代码吗,folderName和images?它们只是数组。folderName是一个字符串ArrayList,用于填充textview。images是一个位图ArrayList,用于填充自定义列表中的ImageView。它们建立在一个doInBackground异步任务中,并传递给onPostExecute。好的。现在呢您需要创建一个模型类(也称为POJO),它可能包含三个变量(字符串标题、位图和isChecked)。然后创建getter和setter方法。在此之后,更改将数组设置为使用新创建的setter方法的代码,并在getView中使用getter获取这些方法。如果您不清楚,请参阅一些教程。发布此文章,我们可以继续实际需求。感谢您的回复-我需要什么代码“全选”按钮,以便将所有复选框标记为选中?啊。您只需将checkBoxState数组的所有值设置为true。然后调用notifyDataSetChange()什么是checkBoxState数组?您能提供一个示例吗?我的适配器位于不同的java文件中,该文件是代码checkBoxState中的值。很抱歉,我不知道它在哪里。谢谢,这更有意义-我应该在image adapter类中的何处添加selectedAll()方法,它是否需要进入GetView()中,或其外部?selectedAll()需要添加站点Getview()。您有
if(adapter != null)
adapter.selectedAll();