Android listview项目更改状态中的复选框

Android listview项目更改状态中的复选框,android,android-listview,Android,Android Listview,大家好,我有一个简单的listview和一个扩展的baseadapter,我想实现以下功能 我对列表项有一个简单的布局:1个复选框和两个列表视图 单击列表项(整个布局,而不仅仅是复选框)时,复选框状态应更改 如何实现此功能 以下是我目前所做的工作: 我的适配器: package ro.gebs.captoom.adapters; import android.content.Context; import android.util.Log; import android.view.Layou

大家好,我有一个简单的listview和一个扩展的baseadapter,我想实现以下功能

我对列表项有一个简单的布局:1个复选框和两个列表视图

单击列表项(整个布局,而不仅仅是复选框)时,复选框状态应更改

如何实现此功能

以下是我目前所做的工作:

我的适配器:

 package ro.gebs.captoom.adapters;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.LinearLayout;

import java.text.DecimalFormat;
import java.util.ArrayList;

import ro.gebs.captoom.R;
import ro.gebs.captoom.datamodel.Mileage;
import ro.gebs.captoom.datamodel.Receipt;
import ro.gebs.captoom.interfaces.MileageReceiptInterface;
import ro.gebs.captoom.utils.fonts.CustomFontTextView;

/**
 * Created by Adrian on 9/19/13.
 */
public class SyncItemAdapter extends BaseAdapter {

    private ArrayList<MileageReceiptInterface> data;
    private Context context;

    public SyncItemAdapter(Context context, ArrayList<MileageReceiptInterface> data) {
        this.context = context;
        this.data = data;
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public MileageReceiptInterface getItem(int position) {
        return data.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        final MileageReceiptInterface item = getItem(position);
        ViewHolder holder = null;

        if (convertView == null) {
            LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            if (item != null) {
                holder = new ViewHolder();
                if (item.getMyType() == MileageReceiptInterface.I_AM_MILEAGE) {
                    convertView = li.inflate(R.layout.sync_mileage_item, parent, false);
                } else {
                    convertView = li.inflate(R.layout.sync_receipt_item, parent, false);
                }

                holder.clickMe = (LinearLayout) convertView;
                holder.itemDate = (CustomFontTextView) convertView.findViewById(R.id.item_date);
                holder.itemStatus = (CheckBox) convertView.findViewById(R.id.item_status);
                holder.itemValue = (CustomFontTextView) convertView.findViewById(R.id.value);

                convertView.setTag(holder);
            }

            final ViewHolder finalHolder = holder;
            holder.clickMe.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    finalHolder.itemStatus.toggle();
                }
            });

        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        DecimalFormat df = new DecimalFormat();
        df.setMaximumFractionDigits(2);

        if (item != null) {
            if (item.getMyType() == MileageReceiptInterface.I_AM_MILEAGE) {
                final Mileage mileage = (Mileage) item;
                holder.itemDate.setText(mileage.getStartDate());
                holder.itemValue.setText(df.format(mileage.getDistance() * mileage.getPrice()) + " " + mileage.getCurrency());
            } else {
                final Receipt receipt = (Receipt) item;
                holder.itemDate.setText(receipt.getDate());
                holder.itemValue.setText(df.format(receipt.getValue()) + " " + receipt.getCurrency());
            }
        }


        return convertView;
    }

    private class ViewHolder {
        LinearLayout clickMe;
        CheckBox itemStatus;
        CustomFontTextView itemDate;
        CustomFontTextView itemValue;
    }


}
包ro.gebs.captoom.adapters;
导入android.content.Context;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.BaseAdapter;
导入android.widget.CheckBox;
导入android.widget.LinearLayout;
导入java.text.DecimalFormat;
导入java.util.ArrayList;
进口滚装机gebs.captoom.R;
导入ro.gebs.captoom.datamodel.milines;
导入ro.gebs.captoom.datamodel.Receipt;
导入ro.gebs.captoom.interfaces.mil接口;
导入ro.gebs.captoom.utils.fonts.CustomFontTextView;
/**
*阿德里安于2013年9月19日创作。
*/
公共类SyncItemAdapter扩展了BaseAdapter{
私有数组列表数据;
私人语境;
公共SyncItemAdapter(上下文、ArrayList数据){
this.context=上下文;
这个数据=数据;
}
@凌驾
public int getCount(){
返回data.size();
}
@凌驾
公共接口getItem(int位置){
返回数据。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
最终接口项=获取项(位置);
ViewHolder=null;
if(convertView==null){
LayoutInflater li=(LayoutInflater)context.getSystemService(context.LAYOUT\u INFLATER\u SERVICE);
如果(项!=null){
holder=新的ViewHolder();
if(item.getMyType()==MilWangeReceiptInterface.I\u AM\u里程){
convertView=li.充气(R.layout.sync\里程\项,父项,false);
}否则{
convertView=li.充气(R.layout.sync\u receipt\u item,父项,false);
}
holder.clickMe=(LinearLayout)convertView;
holder.itemDate=(CustomFontTextView)convertView.findViewById(R.id.item_日期);
holder.itemStatus=(复选框)convertView.findViewById(R.id.item_status);
holder.itemValue=(CustomFontTextView)convertView.findViewById(R.id.value);
convertView.setTag(支架);
}
最终视图持有者finalHolder=持有者;
holder.clickMe.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
finalHolder.itemStatus.toggle();
}
});
}否则{
holder=(ViewHolder)convertView.getTag();
}
DecimalFormat df=新的DecimalFormat();
df.setMaximumFractionDigits(2);
如果(项!=null){
if(item.getMyType()==MilWangeReceiptInterface.I\u AM\u里程){
最终里程=(里程)项目;
holder.itemDate.setText(里程数.getStartDate());
holder.itemValue.setText(df.format(milies.getDistance()*milies.getPrice())+“”+milies.getCurrency());
}否则{
最终收据=(收据)项目;
holder.itemDate.setText(receipt.getDate());
holder.itemValue.setText(df.format(receipt.getValue())+“”+receipt.getCurrency());
}
}
返回视图;
}
私有类视窗持有者{
线性布局单击我;
复选框项目状态;
CustomFontTextView项目日期;
CustomFontTextView项目值;
}
}
在这里,我将适配器链接到我的列表:

    final MergeAdapter all_adapter = new MergeAdapter();

        ArrayList<Folder> folders = new FolderDataSource().selectAllFolders();
        for (Folder folder : folders) {
            final TreeMap<Long, ArrayList<MileageReceiptInterface>> sortedFolderItems = new ReceiptDataSource().loadUnsyncReceipts(folder.getId());
            if (!sortedFolderItems.isEmpty()) {
                final View header1 = inflater.inflate(R.layout.receipt_list_header, null);
                assert header1 != null;
                CustomFontTextView receipt_header_txt = (CustomFontTextView) header1.findViewById(R.id.receipt_header_txt);
                receipt_header_txt.setText(folder.getTitle());
                all_adapter.addView(header1);

                for (long receiptTimeStamp : sortedFolderItems.descendingKeySet()) {
                    SyncItemAdapter folder_stuff = new SyncItemAdapter(mContext, sortedFolderItems.get(receiptTimeStamp));
                    all_adapter.addAdapter(folder_stuff);
                }
            }
        }

        folder_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Toast.makeText(mContext, "You clicked an item", Toast.LENGTH_SHORT).show();
            }
        });
final MergeAdapter all_adapter=new MergeAdapter();
ArrayList folders=new FolderDataSource()。选择AllFolders();
用于(文件夹:文件夹){
final TreeMap sortedFolderItems=new ReceiptDataSource().loadUnsyncReceipts(folder.getId());
如果(!sortedFolderItems.isEmpty()){
最终视图标题1=充气机。充气(R.layout.receipt\u list\u标题,空);
断言头1!=null;
CustomFontTextView收据\头\文本=(CustomFontTextView)头1.findViewById(R.id.receipt\头\文本);
receipt_header_txt.setText(folder.getTitle());
所有适配器添加视图(表头1);
for(长receiptTimeStamp:sortedFolderItems.DressingKeyset()){
SyncItemAdapter folder_stuff=新的SyncItemAdapter(mContext,sortedFolderItems.get(receiptTimeStamp));
all_adapter.addAdapter(文件夹_stuff);
}
}
}
文件夹\u list.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
公共无效onItemClick(AdapterView AdapterView、View视图、int i、long l){
Toast.makeText(mContext,“您点击了一个项目”,Toast.LENGTH_SHORT.show();
}
});
但是,我似乎无法正确捕捉到item clicked事件,因为当我单击列表中的任何项目时,都不会显示toast

有什么想法吗


已编辑:对我的适配器类进行了一些小更改,现在它可以正常工作了

尝试在xml中的复选框中添加clickable=false、focusable=false。您应该在点击列表项后获得祝酒辞。在onItemClick(…)方法中,执行view.findViewById(CheckboxId.toggle()


我最近没有测试它,但它应该可以工作:)

将以下属性添加到列表项的根布局中。这将阻止项目中复选框上的事件:

android:descendantFocusability="blocksDescendants"
谢谢你的邀请