我是android studio的新手,我正在开发一个项目。我有一个ListView
,它由CheckBox
和TextView
组成。我添加了两个按钮add
和delete
。如果我检查CheckBox
并按删除按钮,则该项目将被删除。因此,我设计了一个自定义适配器,它有一个getView()
方法。
此getView()
方法包含CheckBox
的侦听器。当我检查CheckBox
时,是否执行了getView()
方法或仅执行了侦听器?
public View getView(int position, View convertView, ViewGroup parent) {
View rowView;
final int pos = position;
rowView = myInflater.inflate(R.layout.row_layout, null);
TextView textView = (TextView)rowView.findViewById(R.id.content);
final CheckBox checkBox = (CheckBox)rowView.findViewById(R.id.check);
textView.setText( list.get(pos).getContent() );
checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if( checkBox.isChecked() ){
list.get(pos).setChecking(1);
}
else {
list.get(pos).setChecking(0);
}
}
});
return rowView;
}
答案 0 :(得分:2)
当我选中复选框时,是调用getView()方法还是仅调用 监听器被执行了吗?
只会执行侦听器中的代码。在这种情况下:
if( checkBox.isChecked() )
{
list.get(pos).setChecking(1);
}
else
{
list.get(pos).setChecking(0);
}
答案 1 :(得分:0)
每次创建或重用列表项的视图时,都会调用适配器getView()
。在用户看到项目之前执行此方法(因此建议保持此方法简短并避免繁重的计算)。
选中该复选框后,将不会调用getView()
,而是调用复选框的监听器。在这种特殊情况下,您要实现的目标必须分别设置OnCheckedChangeListener
和OnClickListener
复选框和按钮。
您的CustomAdapter.java将如下所示:
public class CustomAdapter extends BaseAdapter {
Context context;
List<String> list;
public static List<Integer> selectedPositions;
public CustomAdapter(Context context,List<String> list){
this.context=context;
this.list=list;
this.selectedPositions=new ArrayList<>(0);
}
@Override
public int getCount() {
return list==null?0:list.size();
}
@Override
public Object getItem(int i) {
return list.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(final int position, View convertView, ViewGroup viewGroup) {
View vi = convertView;
ViewHolder holder;
if(convertView==null){
/****** Inflate rowitem.xml file for each row ( Defined below ) *******/
vi = LayoutInflater.from(context).inflate(R.layout.row_item, null);
/****** View Holder Object to contain rowitem.xml file elements ******/
holder = new ViewHolder(vi);
/************ Set holder with LayoutInflater ************/
vi.setTag( holder );
}
else
holder=(ViewHolder)vi.getTag();
//Set listeners for checkbox and button
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if(compoundButton.isChecked()){
selectedPositions.add(position);
}else{
int count=0;
for(int item:selectedPositions){
if(item==position){
selectedPositions.remove(count);
}
count++;
}
}
}
});
return vi;
}
private class ViewHolder{
CheckBox checkBox;
TextView textView;
ViewHolder(View itemView){
checkBox=(CheckBox)itemView.findViewById(R.id.checkbox);
textView=(TextView)itemView.findViewById(R.id.textView);
}
}
}
活动中的删除按钮将被这样处理:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(CustomAdapter.selectedPositions != null &&
!CustomAdapter.selectedPositions.isEmpty()){
for(int count = 0;
count < CustomAdapter.selectedPositions.size(); count++){
list.remove(CustomAdapter.selectedPositions.get(count));
adapter.notifyDataSetChanged();
}
}
}
});