android - ListView 自定义适配器随机检查值

标签 android checkbox android-listview listadapter

我使用自定义适配器制作了一个 ListView ,其中包含 ImageView 、 TextView 和复选框

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

ListView 有一个 onClickListener,复选框有 onCheckListener..

我在开始时使用了一个 bool 数组(名为 status)来将选中或未初始化的复选框设置为 false。

假设列表中有 19 个项目,我选中第一个项目的复选框,它可以正常工作,并且 bool 数组的索引 0 更改为 true。 但是,当我滚动并检查列表的最后一个项目时,列表的第三个位置被反射(reflect),并且 bool 数组的索引 3 变为 true。

还会自动选中许多其他复选框。

Java 代码

public class Search_list extends Activity {

static String str1 = "v1", str2 = "v2";
String s, item, idd;
static int spnr, range1, range2;
private CarHelper dbcarhelper = null;
private Cursor ourCursor;
CarHelper h = null;
List<String[]> names2 = null;
ListView LV;
MyCustomAdapter dataAdapter = null;
private ArrayList<Boolean> status;

byte[] Image = null;
Cursor c;
Bitmap decodedByte;

String c1_make = null, c1_model = null, c1_ver = null, c2_make = null,
        c2_model = null, c2_ver = null;

int cntr = 0;

Button b1;

CheckBox cb;

protected ProgressDialog dialog;

List<String[]> mlist = new ArrayList<String[]>();
TextView tv1;

ArrayList<String> stg1;

ArrayList<String> arr_make = new ArrayList<String>();
ArrayList<String> arr_model = new ArrayList<String>();
ArrayList<String> arr_ver = new ArrayList<String>();
ArrayList<Bitmap> arr_img = new ArrayList<Bitmap>();


@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.search_list);

    dialog = ProgressDialog.show(Search_list.this, "Loading",
            "Please Wait...");

    status = new ArrayList<Boolean>(); /

    LV = (ListView) findViewById(R.id.list);

    //------------------ Compare button onClick() ------------------------------

    b1 = (Button) findViewById(R.id.btnCmp);
    b1.setOnClickListener(new Button.OnClickListener() {

        public void onClick(View arg0) {

            int count = 1;

            if (cntr == 1) {
                Toast.makeText(getApplicationContext(),
                        "Please select atleast two cars!",
                        Toast.LENGTH_LONG).show();
            } else {

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

                    System.out.println("Compare click Position= " + i + " Status: "
                            + status.get(i));
                    // System.out.println();

                    if (status.get(i)) {

                        if (count == 2) {
                            c2_make = arr_make.get(i);
                            c2_model = arr_model.get(i);
                            c2_ver = arr_ver.get(i);

                            count++;
                        }

                        if (count == 1) {
                            c1_make = arr_make.get(i);
                            c1_model = arr_model.get(i);
                            c1_ver = arr_ver.get(i);

                            count++;
                        }

                    } else {

                    }

                }

                Intent intent = new Intent(Search_list.this, DispComp.class);
                Bundle b = new Bundle();

                b.putString("car1", c1_make);
                b.putString("carm1", c1_model);
                b.putString("carv1", c1_ver);

                b.putString("car2", c2_make);
                b.putString("carm2", c2_model);
                b.putString("carv2", c2_ver);

                intent.putExtras(b);
                startActivity(intent);
            }
        }
    });

    //--------------------------------------------------------------------------

    dbcarhelper = new CarHelper(this);
    dbcarhelper.createDatabase();
    dbcarhelper.openDataBase();

    if (s != null) {
        startManagingCursor(ourCursor);
    }

    if (spnr == 1) {

        byMakeModel();
    }

    if (spnr == 2) {

        byBudgetFuel();

    }

    fill_list();

    for (int i = 0; i < arr_make.size(); i++) {
        status.add(false);
    }

    System.out.println("Inside onCreate() ... status all null..! ");

    dialog.dismiss();

}

public void SetId(String s1, String s2, int s) {

    System.out.println("SetMake spnr= |" + spnr + "|");
    System.out.println("SetMake s= |" + s + "|");

    str1 = s1;
    str2 = s2;
    spnr = s;

    System.out.println("SetMake aftr spnr= |" + spnr + "|");

}

public void SetBudgetFuel(String s1, String s2, int s, int r1, int r2) {

    System.out.println("SetBudget spnr= |" + spnr + "|");
    System.out.println("SetBudget s= |" + s + "|");

    System.out.println("SetBudget r1= |" + r1 + "|");
    System.out.println("SetBudget r2= |" + r2 + "|");

    str1 = s1;
    str2 = s2;
    spnr = s;
    range1 = r1;
    range2 = r2;

    System.out.println("SetMake aftr spnr= |" + spnr + "|");

}

// -------------------------------------------------------------------------

public void byMakeModel() {

    // make n model selected *******************************

    if (str2.equalsIgnoreCase("(Select)")) {

        dbcarhelper.search_by_make(str1);

    } else {

        dbcarhelper.search_by_makemodel(str1, str2);

    }

}

// -------------------------------------------------------------------------

public void byBudgetFuel() {

    // budget or fuel selected
    // ************************************************

    if (str1.equalsIgnoreCase("Any Budget")) {

        dbcarhelper.search_by_fuel(str2);

    }

    else if (str2.equalsIgnoreCase("All")) {

        dbcarhelper.search_by_budget(range1, range2);

    }

    else {

        dbcarhelper.search_by_budgetfuel(str2, range1, range2);

    }

}

// -------------------------------------------------------------------------

public void fill_list() {
    final CarHelper h = new CarHelper(getApplicationContext());

    Toast.makeText(getApplicationContext(), "Inside if case",
            Toast.LENGTH_LONG).show();

    mlist = h.selectAllb2();

    stg1 = new ArrayList<String>();

    int x = 0;
    String stg;

    for (String[] srch : mlist) {

        stg = "Make: " + srch[0] + "\nModel: " + srch[1] + " \nVersion: "
                + srch[2] + "\nPrice: Rs. " + srch[3];

        stg1.add(stg);

        arr_make.add(srch[0]);
        arr_model.add(srch[1]);
        arr_ver.add(srch[2]);

        System.out.println("srch 0" + srch[0] + "\nsrch 1" + srch[1]
                + "\nsrch 2" + srch[2] + "\nsrch 3" + srch[3]);

        x++;
    }

    System.out.println("length--------------------- " + stg1.size());

    // ----------------Image--------------------
    int run = 0;
    c = dbcarhelper.fetchImgRow("1");

    if (c.moveToFirst()) {
        do {

            Image = c.getBlob(c.getColumnIndex("img_str"));

            System.out.println("Image = " + Image);

            System.out.println("run = " + run);

            byte[] decodedString = Base64.decode(Image, Base64.DEFAULT);
            decodedByte = BitmapFactory.decodeByteArray(decodedString, 0,
                    decodedString.length);

            arr_img.add(decodedByte);

            System.gc();

            run++;

        } while (c.moveToNext());

    }
    dbcarhelper.close();

    // ----------------Image--------------------

    System.out.println("run after close() = " + run);

    dataAdapter = new MyCustomAdapter(this, R.layout.new_search_adptr, stg1);

    LV.setAdapter(dataAdapter);

    int[] colors = { 0, 0xff00ffff, 0 };
    LV.setDivider(new GradientDrawable(Orientation.RIGHT_LEFT, colors));
    LV.setDividerHeight(4);

    LV.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

            New_Details det = new New_Details();

            System.out.println("Inside Click !");

            String car1 = h.srch_make.get(position);
            String carm1 = h.srch_model.get(position);
            String carv1 = h.srch_ver.get(position);

            det.setImg(arr_img.get(position));

            // Bitmap car_img = arr_img.get(position);
            // System.out.println("position: " + position);
            // System.out.println("arr_img position: " +
            // arr_img.get(position));

            Intent intent = new Intent(Search_list.this, New_Details.class);
            Bundle b = new Bundle();
            b.putString("car1", car1);
            b.putString("carm1", carm1);
            b.putString("carv1", carv1);

            intent.putExtras(b);
            startActivity(intent);

        }
    });

}

private class MyCustomAdapter extends ArrayAdapter<String> {

    public MyCustomAdapter(Context context, int textViewResourceId,

    ArrayList<String> sList) {
        super(context, textViewResourceId, sList);

    }

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

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

        ViewHolder holder = null;


        //Log.v("ConvertView", String.valueOf(position));

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

            //---------- Setting the checkBoxes -----------------------------------

            if (status.get(position)) {

                holder.chkbox.setChecked(true);

            } else {

                holder.chkbox.setChecked(false);
            }

            //-----------------------------------------------------------------

            holder.imageview = (ImageView) convertView
                    .findViewById(R.id.imageView1);

            convertView.setTag(holder);

            holder.chkbox.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {

                    CheckBox cb = (CheckBox) v;
                    if (cb.isChecked()) {

                        // User checked (selected) a car
                        // *********************************

                        if (cntr > 1) {

                            // More than two cars selected

                            Toast.makeText(getApplicationContext(),
                                    "Please select only two cars!",
                                    Toast.LENGTH_LONG).show();

                            cb.setChecked(false);

                        } else {

                            // car selected


                            status.set(position, true);
                            cntr++;

                            System.out.println("Chk List Position= " + position );

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

                                System.out.println("Chkbox chkd Position= " + i + " Status: "
                                        + status.get(i));
                            }
                        }

                    } else {

                        // User Unchecked (de - selected) a car
                        // *********************************


                        cntr--;
                        status.set(position, false);

                        System.out.println("Unchk List Position= " + position );

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

                            System.out.println("UnChkbox chkd Position= " + i + " Status: "
                                    + status.get(i));
                        }

                    }

                }
            });

        } else {

            holder = (ViewHolder) convertView.getTag();
            holder.chkbox.setOnCheckedChangeListener(null);

        }

        holder.text.setText(stg1.get(position).toString());

        // setting image
        holder.imageview.setImageBitmap(arr_img.get(position));

        return convertView;
    }
}

}

请帮我找到解决办法。谢谢。

堆栈跟踪

08-17 06:58:16.798: W/dalvikvm(698): threadid=1: thread exiting with uncaught exception (group=0x40015560)
08-17 06:58:16.808: E/AndroidRuntime(698): FATAL EXCEPTION: main
08-17 06:58:16.808: E/AndroidRuntime(698): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
08-17 06:58:16.808: E/AndroidRuntime(698):  at android.graphics.BitmapFactory.nativeDecodeByteArray(Native Method)
08-17 06:58:16.808: E/AndroidRuntime(698):  at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:405)
08-17 06:58:16.808: E/AndroidRuntime(698):  at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:418)
08-17 06:58:16.808: E/AndroidRuntime(698):  at com.MyAuto.Search_list.fill_list(Search_list.java:334)
08-17 06:58:16.808: E/AndroidRuntime(698):  at com.MyAuto.Search_list.onCreate(Search_list.java:196)
08-17 06:58:16.808: E/AndroidRuntime(698):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-17 06:58:16.808: E/AndroidRuntime(698):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
08-17 06:58:16.808: E/AndroidRuntime(698):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
08-17 06:58:16.808: E/AndroidRuntime(698):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
08-17 06:58:16.808: E/AndroidRuntime(698):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
08-17 06:58:16.808: E/AndroidRuntime(698):  at android.os.Handler.dispatchMessage(Handler.java:99)
08-17 06:58:16.808: E/AndroidRuntime(698):  at android.os.Looper.loop(Looper.java:123)
08-17 06:58:16.808: E/AndroidRuntime(698):  at android.app.ActivityThread.main(ActivityThread.java:3683)
08-17 06:58:16.808: E/AndroidRuntime(698):  at java.lang.reflect.Method.invokeNative(Native Method)
08-17 06:58:16.808: E/AndroidRuntime(698):  at java.lang.reflect.Method.invoke(Method.java:507)
08-17 06:58:16.808: E/AndroidRuntime(698):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-17 06:58:16.808: E/AndroidRuntime(698):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-17 06:58:16.808: E/AndroidRuntime(698):  at dalvik.system.NativeStart.main(Native Method)

最佳答案

供引用使用示例

Get Selected Item Using Checkbox in Listview

将您的适配器类更改为以下。

您需要重写getCount并使用SparseBooleanArray

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

    ArrayList<String> myList; 
    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) {
        ViewHolder holder = null;
        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) {
         return mCheckStates.get(position, false);
     }

     public void setChecked(int position, boolean isChecked) {
         mCheckStates.put(position, isChecked);

     }

     public void toggle(int position) {
         setChecked(position, !isChecked(position));

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


         mCheckStates.put((Integer) buttonView.getTag(), isChecked);    

    }
}

要点击按钮

StringBuilder result = new StringBuilder();
for(int i=0;i<youradapter.mCheckStates.size();i++)
{
if(youradapter.mCheckStates.get(i)==true)
{
result.append(arr_make.get(i).toString()+" "+arr_model.get(i).toString()+" "+arr_ver.get(i).toString());
result.append("\n");
}
}
Toast.makeText(MainActivity.this, result, 1000).show();
}

关于android - ListView 自定义适配器随机检查值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18180349/

相关文章:

android - AsyncTask OnPostExecute 不更新 TextView

Android 猴子赛跑者标记复选框

jquery - 知道复选框是否被选中的正确方法

android - 如何判断 ListView 何时有 subview ?

android - 使 View 宽度 wrap_content,但重量不超过 0.5

安卓: Activity 列表

Android 导航组件 Unresolved reference

ios - 在 Swift 中使用复选框

java - Baseadapter 中的 Android Listview 如何保存对列表的更改

android - Listview多次调用getView方法