为什么我自己的ListAdapter不起作用?

时间:2011-11-02 15:49:19

标签: android android-listview baseadapter listview-adapter

我遇到的问题是当我点击一个chekbox并使列表视图向上滚动所选复选框时更改,或者有时如果选择第一个复选框以便也选择最后一个复选框。我知道我的英语还不够好,抱歉。任何帮助表示赞赏。

import java.util.ArrayList;
import java.util.Hashtable;


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

public class MyListAdapter extends BaseAdapter{

     public static class ViewHolder {

         public CheckBox chkb = null;

    } 


    private LayoutInflater mInflater;

    private ArrayList<MyListAdapterItem> myListAdapterItems = null;

    private Hashtable<Object, Object> items = null;

    private boolean selectAll = false;

    private boolean readOnly = false;

    public MyListAdapter(Context context, ArrayList<MyListAdapterItem> myListAdapterItems, boolean selectAll, boolean readOnly) {

        mInflater = LayoutInflater.from(context);

        this.myListAdapterItems = myListAdapterItems;

        this.selectAll = selectAll;

        this.readOnly = readOnly;

        items = new Hashtable<Object, Object>();
    }

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

        ViewHolder viewHolder = null;

        if (convertView == null) {

            convertView = mInflater.inflate(R.layout.chkb_fila, null);

            viewHolder = new ViewHolder();

            viewHolder.chkb = (CheckBox) convertView.findViewById(R.id.chkbCultivo);

            convertView.setTag(viewHolder);

        }else {

            viewHolder = (ViewHolder) convertView.getTag();

        }

        items.put(myListAdapterItems.get(position), viewHolder.chkb);

        viewHolder.chkb.setText(myListAdapterItems.get(position).getDescription());

        if(selectAll){

            viewHolder.chkb.setChecked(true);
        }

        if(readOnly){

            viewHolder.chkb.setEnabled(false);

        }

        return convertView;

    }


    public int getCount() {

        return myListAdapterItems.size();

    }


    public Object getItem(int position) {

        return myListAdapterItems.get(position);

    }


    public long getItemId(int position) {

        return position;

    }

    /**
     * @return the myListItems
     */
    public ArrayList<MyListAdapterItem> getMySelectedListItems() {

        ArrayList<MyListAdapterItem> listSelectedItems = new ArrayList<MyListAdapterItem>();

        CheckBox tmpCheckBox = null;

        for(int i=0; i<items.size(); i++){

            tmpCheckBox = (CheckBox) items.get(myListAdapterItems.get(i));

            if(tmpCheckBox.isChecked()){

                listSelectedItems.add(myListAdapterItems.get(i));

            }

        }

        return listSelectedItems;

    }

}

3 个答案:

答案 0 :(得分:0)

问题是getView方法重用了视图,因此必须确保更新该方法中的复选框状态;这也意味着你必须在某个地方保存这个状态。

答案 1 :(得分:0)

以下是您正在寻找的一些链接。高级,但如果你坚持下去,不要放弃这个,你将学到很多!看看:

Android: ListView elements with multiple clickable buttons

Android custom list item with nested widgets

Rating bars and buttons on listItems

答案 2 :(得分:0)

2个选项。

1)不要回收你的观点。总是给新人充气。这是“懒惰”,但如果您的应用没有太多条目,则不太可能引入错误。

2)确保在每个视图上设置所有内容。你正在重复使用它们,所以如果你之前已经设置了一些东西,它就会保持这种状态。

改变这个:

if(selectAll){

        viewHolder.chkb.setChecked(true);
    }

    if(readOnly){

        viewHolder.chkb.setEnabled(false);

    }

        viewHolder.chkb.setChecked(selectAll);
        viewHolder.chkb.setEnabled(!readOnly);

使用if块,你没有设置布尔值的另一面(你也可以使用else块,但这更详细)。