列表视图自定义适配器随机检查值 [英] List View custom adapter randomly checking values
问题描述
我做了一个列表视图与自定义适配器有一个ImageView的,TextView的和一个复选框
-------------------------------------- -
< ImageView的--- --- TextView的复选框>
---------------------------------------
在ListView有一个onClickListener它和复选框有onCheckListener ..
我使用了一个布尔数组(称为状态)来设置的复选框选中,或在开始时没有初始化为false。
假设我有名单上的19个项目,我先检查项目的复选框,它工作正常且布尔数组的索引0更改为真。
但是,当我滚动和检查列表的最后一个项目第三的位置被反射,布尔数组的索引3成真的话。
还有很多其他的复选框被自动选中。
的Java code
公共类Search_list延伸活动{静态字符串STR1 =V1,str2的=V2;
字符串s,项目,国际直拨电话;
静态INT SPNR,范围1,范围2;
私人CarHelper dbcarhelper = NULL;
私人光标ourCursor;
CarHelper H = NULL;
清单<的String []> names2 = NULL;
LV的ListView;
MyCustomAdapter DataAdapter的= NULL;
私人的ArrayList<布尔>状态;的byte []图片= NULL;
光标C;
位图德codedByte;字符串c1_make = NULL,c1_model = NULL,c1_ver = NULL,c2_make = NULL,
c2_model = NULL,c2_ver = NULL;INT CNTR = 0;按钮B1;复选框CB;保护ProgressDialog对话框;清单<的String []> mlist =新的ArrayList<的String []>();
TextView的TV1;ArrayList的<串GT; STG1;ArrayList的<串GT; arr_make =新的ArrayList<串GT;();
ArrayList的<串GT; arr_model =新的ArrayList<串GT;();
ArrayList的<串GT; arr_ver =新的ArrayList<串GT;();
ArrayList的<&位图GT; arr_img =新的ArrayList<&位图GT;();
@覆盖
保护无效的onCreate(捆绑savedInstanceState){
// TODO自动生成方法存根
super.onCreate(savedInstanceState);
的setContentView(R.layout.search_list); 对话框= ProgressDialog.show(Search_list.this,加载,
请稍候...); 状态=新的ArrayList<布尔>(); / LV =(ListView控件)findViewById(R.id.list); // ------------------比较按钮的onClick()------------------------- ----- B1 =(按钮)findViewById(R.id.btnCmp);
b1.setOnClickListener(新Button.OnClickListener(){ 公共无效的onClick(查看为arg0){ 诠释计数= 1; 如果(CNTR == 1){
Toast.makeText(getApplicationContext(),
请至少选择两车!
Toast.LENGTH_LONG).show();
}其他{ 的for(int i = 0; I< status.size();我++){ 的System.out.println(比较点击位置=+ I +状态:
+ status.get(I));
//的System.out.println(); 如果(status.get(ⅰ)){ 如果(计数== 2){
c2_make = arr_make.get(ⅰ);
c2_model = arr_model.get(ⅰ);
c2_ver = arr_ver.get(ⅰ); 算上++;
} 如果(计数== 1){
c1_make = arr_make.get(ⅰ);
c1_model = arr_model.get(ⅰ);
c1_ver = arr_ver.get(ⅰ); 算上++;
} }其他{ } } 意向意图=新意图(Search_list.this,DispComp.class);
束B =新包(); 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(二);
startActivity(意向);
}
}
}); // ------------------------------------------------ -------------------------- dbcarhelper =新CarHelper(本);
dbcarhelper.createDatabase();
dbcarhelper.openDataBase(); 如果(S!= NULL){
startManagingCursor(ourCursor);
} 如果(SPNR == 1){ byMakeModel();
} 如果(SPNR == 2){ byBudgetFuel(); } fill_list(); 的for(int i = 0; I< arr_make.size();我++){
status.add(假);
} 的System.out.println(内部的onCreate()...状态的所有空..!); dialog.dismiss();}公共无效SETID(字符串S1,S2的字符串,int类型){ 的System.out.println(SetMake SPNR = |+ SPNR +|);
的System.out.println(SetMake S = |S +|); STR1 = S1;
STR2 = S2;
SPNR =秒; 的System.out.println(SetMake AFTR SPNR = |+ SPNR +|);}公共无效SetBudgetFuel(字符串S1,S2的字符串,int类型,诠释R1,R2 INT){ 的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 =秒;
范围1 = R1;
范围2 = R2; 的System.out.println(SetMake AFTR SPNR = |+ SPNR +|);}// ------------------------------------------------ -------------------------公共无效byMakeModel(){ //从N模式选择******************************* 如果(str2.equalsIgnoreCase((选择))){ dbcarhelper.search_by_make(STR1); }其他{ dbcarhelper.search_by_makemodel(STR1,STR2); }}// ------------------------------------------------ -------------------------公共无效byBudgetFuel(){ //预算或选择燃料
// ************ 如果(str1.equalsIgnoreCase(任何预算)){ dbcarhelper.search_by_fuel(STR2); } 否则,如果(str2.equalsIgnoreCase(全部)){ dbcarhelper.search_by_budget(范围1,范围2); } 其他{ dbcarhelper.search_by_budgetfuel(STR2,范围1,范围2); }}// ------------------------------------------------ -------------------------公共无效fill_list(){
最后CarHelper H =新CarHelper(getApplicationContext()); Toast.makeText(getApplicationContext(),如果内幕案,
Toast.LENGTH_LONG).show(); mlist = h.selectAllb2(); STG1 =新的ArrayList<串GT;(); INT X = 0;
串英镑; 对于(字符串[] SRCH:mlist){ 英镑=品牌:+ SRCH [0] +\\ nModel:+ SRCH [1] +\\ n版本:
+ SRCH [2] +\\ nPrice:卢比+ 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(长度---------------------+ stg1.size()); // - - - - - - - - 图片 - - - - - - - - - -
INT运行= 0;
C = dbcarhelper.fetchImgRow(1); 如果(c.moveToFirst()){
做{ 图像= c.getBlob(c.getColumnIndex(img_str)); 的System.out.println(图像=+图像); 的System.out.println(运行=+运行); 字节[]德codedString = Base64.de code(图像,Base64.DEFAULT);
德codedByte = BitmapFactory.de codeByteArray的(德codedString,0,
德codedString.length); arr_img.add(德codedByte); System.gc()的; 运行++; }而(c.moveToNext()); }
dbcarhelper.close(); // - - - - - - - - 图片 - - - - - - - - - - 的System.out.println(结束后的run()=+运行); DataAdapter的=新MyCustomAdapter(这一点,R.layout.new_search_adptr,STG1); LV.setAdapter(DataAdapter的); INT []颜色= {0,0xff00ffff,0};
LV.setDivider(新GradientDrawable(Orientation.RIGHT_LEFT,颜色));
LV.setDividerHeight(4); LV.setOnItemClickListener(新OnItemClickListener(){ @覆盖
公共无效onItemClick(适配器视图<>母公司,观景,
INT位置,长的id){ New_Details DET =新New_Details(); 的System.out.println(内部咔嚓!); 字符串CAR1 = h.srch_make.get(位置);
字符串CARM1 = h.srch_model.get(位置);
字符串carv1 = h.srch_ver.get(位置); det.setImg(arr_img.get(位置)); //位图car_img = arr_img.get(位置);
//的System.out.println(位置:+位置);
//的System.out.println(arr_img立场:+
// arr_img.get(位置)); 意向意图=新意图(Search_list.this,New_Details.class);
束B =新包();
b.putString(CAR1,CAR1);
b.putString(CARM1,CARM1);
b.putString(carv1,carv1); intent.putExtras(二);
startActivity(意向); }
});}私有类MyCustomAdapter扩展ArrayAdapter<串GT; { 公共MyCustomAdapter(上下文的背景下,INT textViewResourceId, ArrayList的<串GT; SLIST){
超(背景下,textViewResourceId,SLIST); } 私有类ViewHolder {
TextView的文本;
复选框chkbox;
ImageView的ImageView的;
} @覆盖
公共查看getView(最终诠释的立场,观点convertView,
父母的ViewGroup){ ViewHolder支架=无效;
//Log.v(\"ConvertView,将String.valueOf(位置)); 如果(convertView == NULL){ LayoutInflater VI =(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = vi.inflate(R.layout.new_search_adptr,NULL); 持有人=新ViewHolder();
holder.text =(TextView中)convertView
.findViewById(R.id.adapterText1);
holder.chkbox =(复选框)convertView
.findViewById(R.id.checkBox1); // ----------设置复选框----------------------------------- 如果(status.get(位置)){ holder.chkbox.setChecked(真); }其他{ holder.chkbox.setChecked(假);
} // ------------------------------------------------ ----------------- holder.imageview =(ImageView的)convertView
.findViewById(R.id.imageView1); convertView.setTag(保持器); holder.chkbox.setOnClickListener(新View.OnClickListener(){
公共无效的onClick(视图v){ 复选框CB =(复选框)V;
如果(cb.isChecked()){ //用户检查(选择)汽车
// ********** 如果(CNTR→1){ //以上两款车选择 Toast.makeText(getApplicationContext(),
请选择只有两种车!
Toast.LENGTH_LONG).show(); cb.setChecked(假); }其他{ //选车
status.set(位置,真正的);
CNTR ++; 的System.out.println(清洁香港列表位置=+位置); 的for(int i = 0; I< status.size();我++){ 的System.out.println(Chkbox CHKD位置=+ I +状态:
+ status.get(I));
}
} }其他{ //用户未选中(德 - 选择)汽车
// **********
cntr--;
status.set(位置,FALSE); 的System.out.println(Unchk列表位置=+位置); 的for(int i = 0; I< status.size();我++){ 的System.out.println(UnChkbox CHKD位置=+ I +状态:
+ status.get(I));
} } }
}); }其他{ 支架=(ViewHolder)convertView.getTag();
holder.chkbox.setOnCheckedChangeListener(NULL); } holder.text.setText(stg1.get(位置)的ToString()); //设置图像
holder.imageview.setImageBitmap(arr_img.get(位置)); 返回convertView;
}
}}
请帮我找到一个解决方案。谢谢你。
堆栈跟踪
6月八日至17日:58:16.798:W / dalvikvm(698):主题ID = 1:螺纹未捕获的异常退出(组= 0x40015560)
6月8日至17日:58:主营业务收入168.08:E / AndroidRuntime(698):致命异常:主要
6月8日至17日:58:主营业务收入168.08:E / AndroidRuntime(698):java.lang.OutOfMemoryError:位图大小超过VM预算
6月8日至17日:58:主营业务收入168.08:E / AndroidRuntime(698):在android.graphics.BitmapFactory.nativeDe codeByteArray的(本机方法)
6月8日至17日:58:主营业务收入168.08:E / AndroidRuntime(698):在android.graphics.BitmapFactory.de codeByteArray的(BitmapFactory.java:405)
6月8日至17日:58:主营业务收入168.08:E / AndroidRuntime(698):在android.graphics.BitmapFactory.de codeByteArray的(BitmapFactory.java:418)
6月8日至17日:58:主营业务收入168.08:E / AndroidRuntime(698):在com.MyAuto.Search_list.fill_list(Search_list.java:334)
6月8日至17日:58:主营业务收入168.08:E / AndroidRuntime(698):在com.MyAuto.Search_list.onCreate(Search_list.java:196)
6月8日至17日:58:主营业务收入168.08:E / AndroidRuntime(698):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
6月8日至17日:58:主营业务收入168.08:E / AndroidRuntime(698):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
6月8日至17日:58:主营业务收入168.08:E / AndroidRuntime(698):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
6月8日至17日:58:主营业务收入168.08:E / AndroidRuntime(698):在android.app.ActivityThread.access $ 1500(ActivityThread.java:117)
6月8日至17日:58:主营业务收入168.08:E / AndroidRuntime(698):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:931)
6月8日至17日:58:主营业务收入168.08:E / AndroidRuntime(698):在android.os.Handler.dispatchMessage(Handler.java:99)
6月8日至17日:58:主营业务收入168.08:E / AndroidRuntime(698):在android.os.Looper.loop(Looper.java:123)
6月8日至17日:58:主营业务收入168.08:E / AndroidRuntime(698):在android.app.ActivityThread.main(ActivityThread.java:3683)
6月8日至17日:58:主营业务收入168.08:E / AndroidRuntime(698):在java.lang.reflect.Method.invokeNative(本机方法)
6月8日至17日:58:主营业务收入168.08:E / AndroidRuntime(698):在java.lang.reflect.Method.invoke(Method.java:507)
6月8日至17日:58:主营业务收入168.08:E / AndroidRuntime(698):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)
6月8日至17日:58:主营业务收入168.08:E / AndroidRuntime(698):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
6月8日至17日:58:主营业务收入168.08:E / AndroidRuntime(698):在dalvik.system.NativeStart.main(本机方法)
有关参考使用示例
<一个href=\"http://stackoverflow.com/questions/18162931/android-get-selected-item-using-checkbox-in-listview-when-i-click-a-button/18164177#18164177\">Android:获取选定的项目列表视图中使用复选框,当我点击一个按钮
更改适配器类以下。
您需要重写 getCount将
,并使用 SparseBooleanArray
私有类MyCustomAdapter扩展ArrayAdapter&LT;串GT;实现CompoundButton.OnCheckedChangeListener { ArrayList的&LT;串GT; myList中;
公共MyCustomAdapter(上下文的背景下,INT textViewResourceId, ArrayList的&LT;串GT; SLIST){
超(背景下,textViewResourceId,SLIST);
mCheckStates =新SparseBooleanArray(sList.size());
myList中= SLIST;
}
私人SparseBooleanArray mCheckStates;
私有类ViewHolder {
TextView的文本;
复选框chkbox;
ImageView的ImageView的;
} @覆盖
公众诠释的getCount(){
返回stg1.size();
} @覆盖
公共查看getView(最终诠释的立场,观点convertView,父母的ViewGroup){
ViewHolder支架=无效;
如果(convertView == NULL){
LayoutInflater VI =(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = vi.inflate(R.layout.new_search_adptr,NULL);
持有人=新ViewHolder();
holder.text =(TextView中)convertView
.findViewById(R.id.adapterText1);
holder.chkbox =(复选框)convertView
.findViewById(R.id.checkBox1);
holder.imageview =(ImageView的)convertView
.findViewById(R.id.imageView1);
convertView.setTag(保持器); }其他{
支架=(ViewHolder)convertView.getTag();
}
holder.chkbox.setTag(位置);
holder.chkbox.setChecked(mCheckStates.get(位置,FALSE));
holder.chkbox.setOnCheckedChangeListener(本);
holder.text.setText(stg1.get(位置)的ToString());
holder.imageview.setImageBitmap(arr_img.get(位置));
返回convertView;
} 公共布尔器isChecked(INT位置){
返回mCheckStates.get(位置,FALSE);
} 公共无效setChecked(INT位置,布尔器isChecked){
mCheckStates.put(位置,器isChecked); } 公共无效切换(INT位置){
setChecked(位置,器isChecked(位置)!); }
@覆盖
公共无效onCheckedChanged(CompoundButton buttonView,
布尔器isChecked){
mCheckStates.put((整数)buttonView.getTag(),器isChecked); }
}
要得到按钮点击
StringBuilder的结果=新的StringBuilder();
的for(int i = 0; I&LT; youradapter.mCheckStates.size();我++)
{
如果(youradapter.mCheckStates.get(我)==真)
{
result.append(arr_make.get(ⅰ)的ToString()++ arr_model.get(ⅰ)的ToString()++ arr_ver.get(ⅰ)的ToString());
result.append(\\ n);
}
}
Toast.makeText(MainActivity.this,因此,1000).show();
}
I have made a list view with a custom Adapter having an imageview, textview and a checkBox
---------------------------------------
<ImageView --- textView --- checkbox >
---------------------------------------
The listview has an onClickListener to it and the checkboxes have onCheckListener..
I have used a boolean array (named as status) to set the checkboxes checked or not initialized to false in the begining.
Suppose I have 19 items on the list and I check the checkbox of first item it works properly and index 0 of the boolean array is changed to true. But when I scroll and check the last item 3rd position of the list is reflected and index 3 of the boolean array turns true.
Also many other checkboxes are automatically checked.
Java Code
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;
}
}
}
Please help me find a solution. Thank you.
Stack Trace
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)
For reference use the example
Android: Get Selected Item Using Checkbox in Listview when I click a Button
Change your adapter class to below.
You need to override getCount
and use 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);
}
}
To get on Button click
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();
}
这篇关于列表视图自定义适配器随机检查值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!