【问题标题】:Custom adapter with editText and Check Box and TextView带有 editText 和 Check Box 和 TextView 的自定义适配器
【发布时间】:2015-10-11 05:25:35
【问题描述】:

我卡在了 listview 的适配器中: 我在适配器中有一个 textView(Name)、checkbox、editText(quantity of name)。 默认 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 :

【问题讨论】:

  • 如果复选框被选中,您必须在 getview 中检查复选框,然后您必须使用 setEnable 方法为 true 才能启用编辑文本。
  • @Clairvoyant:是的,我想这样做,但不能正确地做到这一点,如果您有任何类似的代码,请分享。
  • 你的setOnCheckedChangeListener为什么不在if else逻辑中编写setenabled方法行

标签: android listview android-adapter custom-adapter listview-adapter


【解决方案1】:

在 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
            }
        });

【讨论】:

  • 你不能直接从内部类访问持有者成员,除非你 make then final 。如果您过去做过类似的代码,请分享。
  • 替代方法可能是在您的 ViewHolder 中有一个方法,该方法将执行相同的操作或使 mHolder 变量成为您的 Adapter 类的数据成员,这样您就不需要使其成为最终的
【解决方案2】:

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

    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.arigate.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();
                }
            }
        }
    }
}

现在我没有阻止未选中项目的 Edittext,而是将我的检查修改为:

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++;
                }
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 2018-02-08
    • 2018-11-29
    • 2020-11-21
    相关资源
    最近更新 更多