自定义适配器与editText和复选框和TextView



我被卡在一个适配器的listview:我有一个textView(名称),复选框,editText(数量的名称)在适配器。默认editText将被禁用,但当我选中任何复选框,那么只有我将能够输入数量。在getView中,我一直在写代码。在listview的OnItemClick中,我需要存储Model对象并存储在DataBase中。

package com.example.lokesh.agrigate.adapters;
import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import com.example.lokesh.agrigate.R;
import com.example.lokesh.agrigate.models.Crop;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * Created by Amit on 2015-10-10.
 */
public class CropListViewAdapter extends BaseAdapter {
    Context mContext;
    List<Integer> positions;
    List<Crop> mCrops;
    public CropListViewAdapter(Context mContext, List<Crop> mCrops) {
        this.mContext = mContext;
        this.mCrops = mCrops;
        mSelectedList=new HashMap<>();
        positions=new ArrayList<>();
    }
    Map<Crop,Integer> mSelectedList=null;

    public void addCrop(List<Crop> crops){
        this.mCrops=crops;
    }
    @Override
    public int getCount() {
        return mCrops.size();
    }
    @Override
    public Crop getItem(int position) {
        return mCrops.get(position);
    }
    @Override
    public long getItemId(int position) {
        return position;
    }
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        Crop crop=getItem(position);
        Holder mHolder=null;
        if(convertView==null){
            LayoutInflater inflater=(LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView=  inflater.inflate(R.layout.crop_list_item,null);
            mHolder=new Holder();
            convertView.setTag(mHolder);
            mHolder.mName=(TextView)convertView.findViewById(R.id.crpname);
            mHolder.mHelpText=(TextView)convertView.findViewById(R.id.quantityHelpText);
            mHolder.mCheckox=(CheckBox)convertView.findViewById(R.id.checkCrop);
            mHolder.mQuantityEditText=(EditText)convertView.findViewById(R.id.quantity);
            mHolder.mQuantityEditText.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                }
                @Override
                public void afterTextChanged(Editable s) {
                }
            });
            mHolder.mCheckox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    int getPosition = (int) buttonView.getTag();
                    if (isChecked) {

                    } else {
                    }
                    buttonView.setChecked(isChecked);
                }
            });

        }else{
            mHolder=(Holder)convertView.getTag();
        }
        mHolder.mCheckox.setTag(position);
        mHolder.mName.setText(crop.toString());
        return convertView;
    }
    public void setData(List<Crop> crops) {
        this.mCrops=crops;
    }

    class Holder{
        TextView mName;
        TextView mHelpText;
        CheckBox mCheckox;
        EditText mQuantityEditText;

    }
}

活动OnItemClick:

Map<Crop,Integer> data=new HashMap<>();
AdapterView.OnItemClickListener onCropItemClickListener=new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        CheckBox checkBox=(CheckBox)view.findViewById(R.id.checkCrop);
        Crop crop=(Crop)parent.getItemAtPosition(position);
        if(checkBox.isChecked()){
            EditText ed=(EditText)view.findViewById(R.id.quantity);
            if(!TextUtils.isEmpty(ed.getText().toString()))
              data.put(crop,Integer.parseInt(ed.getText().toString()));
        }else{
           data.remove(crop);
        }
    }
};

请帮我更正适配器和OnItemClick:

在setOnCheckedChangeListener块中启用编辑文本。

        mHolder.mCheckox.setOnCheckedChangeListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
        if (((CheckBox) v).isChecked()){
              mHolder.mQuantityEditText(true)
                } else {
                   mHolder.mQuantityEditText(false)
                }
                buttonView.setChecked(isChecked);//not sure why you doing this, required if you just want to enable/disable edit text
            }
        });

在不同的网站上进行了大量的搜索,理解了问题并纠正了我的代码后,我创建了新的模型,并使用它代替了裁剪,检查我的代码:

    mCropList=mDbAdapter.getAllCrops();
    mEmployees=mDbAdapter.getAllEmployee();
    mTransactionModels=new ArrayList<>();
    for(Crop crop: mCropList){
        TransactionModel transactionModel=new TransactionModel();
        transactionModel.setIsSelected(false);  // this is to keep track of checkbox selection
        transactionModel.setQuantity(0);  // get EditText value of quantity .
        transactionModel.setDate(date);
        transactionModel.setName(crop.getName());
        transactionModel.setId(crop.getId());
        mTransactionModels.add(transactionModel);
    }

mCropListViewAdapter=new CropListViewAdapter(mContext,transactionModels);
            mCropListView.setAdapter(mCropListViewAdapter);   // Setting adapter

下面是修改后的适配器代码:

包com.example.lokesh.agrigate.adapters;

import android.content.Context;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.example.lokesh.agrigate.R;
import com.example.lokesh.agrigate.models.Crop;
import com.example.lokesh.agrigate.models.TransactionModel;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * Created by Amit on 2015-10-10.
 */
public class CropListViewAdapter extends BaseAdapter {
    Context mContext;
    List<Integer> positions;
    List<TransactionModel> mTransactionModels;
    public CropListViewAdapter(Context mContext, List<TransactionModel> mTransactionModels) {
        this.mContext = mContext;
        this.mTransactionModels = mTransactionModels;
        mSelectedList=new HashMap<>();
        positions=new ArrayList<>();
    }
    Map<Crop,Integer> mSelectedList=null;

    public void addCrop(List<TransactionModel> mTransactionModels){
        this.mTransactionModels=mTransactionModels;
    }
    @Override
    public int getCount() {
        return mTransactionModels.size();
    }
    @Override
    public TransactionModel getItem(int position) {
        return mTransactionModels.get(position);
    }
    @Override
    public long getItemId(int position) {
        return position;
    }
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
       final TransactionModel transactionModel =getItem(position);
        Holder mHolder=null;
        if(convertView==null){
            LayoutInflater inflater=(LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView=  inflater.inflate(R.layout.crop_list_item,null);
            mHolder=new Holder();
            convertView.setTag(mHolder);
            mHolder.mName=(TextView)convertView.findViewById(R.id.crpname);
            mHolder.mHelpText=(TextView)convertView.findViewById(R.id.quantityHelpText);
            mHolder.mCheckox=(CheckBox)convertView.findViewById(R.id.checkCrop);
            mHolder.mQuantityEditText=(EditText)convertView.findViewById(R.id.quantity);
            mHolder.watcher=new MutableWatcher();
            mHolder.mQuantityEditText.addTextChangedListener(mHolder.watcher);

            mHolder.mCheckox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    int getPosition = (int) buttonView.getTag();
                    if (isChecked) {

                        mTransactionModels.get(getPosition).setIsSelected(buttonView.isChecked());
                    } else {
                        mTransactionModels.get(getPosition).setIsSelected(buttonView.isChecked());
                    }

                }
            });

        }else{
            mHolder=(Holder)convertView.getTag();
        }
        mHolder.mQuantityEditText.setTag(position);

        mHolder.mCheckox.setTag(position);
        mHolder.mName.setText(transactionModel.getName().toString());
        mHolder.watcher.setActive(false);
        mHolder.mQuantityEditText.setText(mTransactionModels.get(position).getQuantity()+"");
        mHolder.watcher.setPosition(position);
        mHolder.watcher.setActive(true);
        mHolder.mCheckox.setChecked(mTransactionModels.get(position).isSelected());
        return convertView;
    }
    public void setData(List<TransactionModel> mTransactionModels) {
        this.mTransactionModels=mTransactionModels;
    }
    public List<TransactionModel> getmTransactionModels(){
        return mTransactionModels;
    }

    class Holder{
        TextView mName;
        TextView mHelpText;
        CheckBox mCheckox;
        EditText mQuantityEditText;
        MutableWatcher watcher;

    }
    class MutableWatcher implements TextWatcher {
        private int mPosition;
        private boolean mActive;
        void setPosition(int position) {
            mPosition = position;
        }
        void setActive(boolean active) {
            mActive = active;
        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) { }
        @Override
        public void afterTextChanged(Editable s) {
            if (mActive) {
                if(s.length()>0) {
                    mTransactionModels.get(mPosition).setQuantity(Integer.parseInt(s.toString()));
                }else {
                    Toast.makeText(mContext, "Not a valid Number", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }
}

现在,而不是阻止编辑文本未选中的项目,我修改我的检查为:

for(TransactionModel model: models ){
                if(model.isSelected()){
                    if(model.getQuantity()<=0){
                        Toast.makeText(mContext,"Please enter a valid quantity",Toast.LENGTH_SHORT).show();
                        return;
                    }else{
                        model.setEmployee(mCurrentEmployee);
                        mValidModels.add(model);
                    }
                }else{
                    count++;
                }
            }

最新更新