簡體   English   中英

Listview自定義適配器中的復選框在滾動時自動調用onCheckChangeListener

[英]Checkboxes in Listview custom adapter auto call onCheckChangeListener on scrolling

我用自定義適配器做了一個listview。 它具有一個Imageview,textview和一個復選框

---------------------------------------
 <ImageView --- textView --- checkbox >
---------------------------------------

我正在使用一個名為“ mCheckStates”的SparseBooleanArray來跟蹤復選框的狀態。 我也想限制用戶一次只選中兩個復選框。 為此,我使用了一個int變量作為計數器。

但是,當我滾動listView onCheckChangedListener時,該計數減少了一個,有時減少了兩個,從而允許用戶選中3或4個復選框。

我該如何阻止這種情況的發生? 請幫助我找到解決方案。 謝謝。

protected class MyCustomAdapter extends ArrayAdapter<String> implements
        CompoundButton.OnCheckedChangeListener {

    ArrayList<String> myList;
    int count = 0;
    ViewHolder holder = null;

    public MyCustomAdapter(Context context, int textViewResourceId,

    ArrayList<String> sList) {
        super(context, textViewResourceId, sList);
        mCheckStates = new SparseBooleanArray(sList.size());
        myList = sList;
    }

    private SparseBooleanArray mCheckStates;

    private class ViewHolder {
        TextView text;
        CheckBox chkbox;
        ImageView imageview;
    }

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

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

        if (convertView == null) {
            LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = vi.inflate(R.layout.new_search_adptr, null);
            holder = new ViewHolder();
            holder.text = (TextView) convertView
                    .findViewById(R.id.adapterText1);
            holder.chkbox = (CheckBox) convertView
                    .findViewById(R.id.checkBox1);
            holder.imageview = (ImageView) convertView
                    .findViewById(R.id.imageView1);
            convertView.setTag(holder);

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

        holder.chkbox.setTag(position);
        holder.chkbox.setChecked(mCheckStates.get(position, false));
        holder.chkbox.setOnCheckedChangeListener(this);
        holder.text.setText(stg1.get(position).toString());
        holder.imageview.setImageBitmap(arr_img.get(position));
        return convertView;
    }

    public boolean isChecked(int position) {
        System.out.println("inside isChecked");
        return mCheckStates.get(position, false);
    }

    public void setChecked(int position, boolean isChecked) {
        System.out.println("inside setChecked");
        mCheckStates.put(position, isChecked);

    }

    public void toggle(int position) {
        System.out.println("inside toggle");
        setChecked(position, !isChecked(position));

    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView,
            boolean isChecked) {

        System.out.println("\n inside onCheckedChanged: " + isChecked);

        if (isChecked) {
            System.out.println("inside isChecked true");
            System.out.println("count= " + count);

            if (count >= 2) {

                // count--;

                System.out.println("inside count>2: " + count);
                buttonView.setChecked(false);
                Toast.makeText(getApplicationContext(),
                        "Please select only two cars!", Toast.LENGTH_LONG)
                        .show();

            } else {

                count++;
                System.out.println("inside else: " + count);
                mCheckStates.put((Integer) buttonView.getTag(), isChecked);
            }

        } else {

            System.out.println("inside isChecked false" + count);
            mCheckStates.put((Integer) buttonView.getTag(), isChecked);
            count--;

        }

    }
}

我假設您的CustomAdapter用於ListView。 事情就是這樣,單擊單元格進行檢查更加方便。

因此,您可以做的是在自己的適配器上設置一個偵聽器:

adapter .setOnItemClickListener();

然后在活動/片段中實現onItemClickListener

它將捕獲所有單元格的點擊,並向您提供該單元格在列表中的位置。

如果在適配器中用一些Holder類填充單元格並將其設置為單元格的標記,則可以在onItemClick方法中獲取該Holder:

FiltreCellHolder filtreCellHolder = null;                       

filtreCellHolder = (FiltreCellHolder) view.getTag();

然后根據您的全局檢查列表,您可以測試是否檢查了該視圖,並且由於用戶單擊了該視圖,因此您可以檢查/取消對其進行查看:

filtreCellHolder.cellCheck.setChecked(!filtreCellHolder.cellCheck.isChecked());
adapter.notifyDataSetChanged();

我希望這能幫到您。 請將此代碼更改為您的格式

public class ImageAdapter extends BaseAdapter {
    private LayoutInflater mInflater;

    public ImageAdapter() {
        mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public void initialize() {


        count = myList.size();
        thumbnailsselection = new boolean[count];
        notifyDataSetChanged();
    }

    public int getCount() {
        return arrPath.length;
    }

    public Object getItem(int position) {
        return position;
    }

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

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = mInflater.inflate(R.layout.galleryitem, null);
            holder.imageview = (ImageView) convertView
                    .findViewById(R.id.thumbImage);
            holder.checkbox = (CheckBox) convertView
                    .findViewById(R.id.itemCheckBox);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.checkbox.setId(position);
        holder.imageview.setId(position);
        holder.imageview.setAdjustViewBounds(true);
        holder.checkbox.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                CheckBox cb = (CheckBox) v;
                int id = cb.getId();
                if (thumbnailsselection[id]) {
                    cb.setChecked(false);
                    thumbnailsselection[id] = false;
                } else {
                    cb.setChecked(true);
                    thumbnailsselection[id] = true;
                }
            }
        });


        holder.imageview.setImageBitmap(decodeFile(arrPath[position]));
        // holder.imageview.setScaleType(ScaleType.FIT_XY);
        // holder.imageview.setAdjustViewBounds(true);
        holder.checkbox.setChecked(thumbnailsselection[position]);
        holder.id = position;
        return convertView;
    }
}

請在按鈕單擊中檢查此條件

final int len = thumbnailsselection.length;
            int cnt = 0;
            String selectImages = "";
            path = new ArrayList<String>();
            for (int i = 0; i < len; i++) {
                if (thumbnailsselection[i]) {
                    cnt++;
                    selectImages = arrPath[i];
                    path.add(selectImages);
                }
            }
            if (cnt == 0) {
                Toast.makeText(getApplicationContext(),
                        "Please select at least one image",
                        Toast.LENGTH_LONG).show();
            } else if (cnt > 5) {
                Toast.makeText(getApplicationContext(),
                        "Please select only 5 images", Toast.LENGTH_LONG)
                        .show();
            } else {}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM