App crashes when i click on checkbox in contact listview

↘锁芯ラ 提交于 2019-12-08 12:41:30

问题


I am new android Developer and i want to select multiple contacts in list view using check box but yet when i click any check box app is crashed I am Using a custom Adapter plz any one can help me

my contactList ACtivity is following

public class CustomAdapter extends ArrayAdapter<PhoneList> {
    int inflatr;
    Context ctxt;
    ArrayList<PhoneList> data=new ArrayList<PhoneList>();
    public CustomAdapter(Context context, int resource, ArrayList<PhoneList> arr) {

        super(context, resource, arr);
        this.inflatr = resource;
        this.ctxt = context;
        this.data= arr;
    }
    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        UserHolder holder = null;
         View row = convertView;
        if(convertView==null)
        {
             LayoutInflater inflater = ((Activity) ctxt).getLayoutInflater();
             row = inflater.inflate(inflatr, parent, false);
             holder = new UserHolder();
             holder.textName=(TextView)row.findViewById(R.id.lblName);
             holder.stnumber=(TextView)row.findViewById(R.id.mobilenum);
             holder.checked=(CheckBox)row.findViewById(R.id.check);
//           holder.btnEdit = (ImageButton) row.findViewById(R.id.atomPay_removePay);
             row.setTag(holder);
        }
        else
        {
             holder = (UserHolder) row.getTag();            
        }


         PhoneList dta=data.get(position);
         holder.checked.setId(position);
        Toast.makeText(ctxt, "Humayoon    zoooommmm"+dta.getNumber(), Toast.LENGTH_SHORT).show();

        for(int i=1; i<=256; i++)
        {
            holder.textName.setText(dta.getName());
        }
        for(int j=1; j<=256; j++)
        {
            holder.stnumber.setText(dta.getNumber());
        }
//      holder.btnEdit.setOnClickListener(new OnClickListener() {
//          
//          @Override
//          public void onClick(View v) {
//              Toast.makeText(ctxt, "Humayoon    Siddiqueeeeeeeeeeeeeeeeeee"+dta.getName(), Toast.LENGTH_SHORT).show();
//              Intent moreIntent=new Intent(getContext(),ContactList.class);
//              String tName=dta.getName();
//              moreIntent.putExtra("Template",tName);
//              v.getContext().startActivity(moreIntent);
//               // ctxt.startActivity(ctxt,ContactList.class);
//          }
//      });
        return row;
    }
    @Override
    public int getCount() {
//      // TODO Auto-generated method stub
        return data.size();
    }

    static class UserHolder {
        TextView textName;
        TextView textAddress;
        TextView textLocation;
        ImageButton btnEdit;
        Button btnDelete;
        TextView stnumber;
        CheckBox checked;
        }


}

my custom adapter is following

public class CustomAdapter extends ArrayAdapter<PhoneList> {
    int inflatr;
    Context ctxt;
    ArrayList<PhoneList> data=new ArrayList<PhoneList>();
    public CustomAdapter(Context context, int resource, ArrayList<PhoneList> arr) {

        super(context, resource, arr);
        this.inflatr = resource;
        this.ctxt = context;
        this.data= arr;
    }
    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        UserHolder holder = null;
         View row = convertView;
        if(convertView==null)
        {
             LayoutInflater inflater = ((Activity) ctxt).getLayoutInflater();
             row = inflater.inflate(inflatr, parent, false);
             holder = new UserHolder();
             holder.textName=(TextView)row.findViewById(R.id.lblName);
             holder.stnumber=(TextView)row.findViewById(R.id.mobilenum);
             holder.checked=(CheckBox)row.findViewById(R.id.check);
//           holder.btnEdit = (ImageButton) row.findViewById(R.id.atomPay_removePay);
             row.setTag(holder);
        }
        else
        {
             holder = (UserHolder) row.getTag();            
        }


         PhoneList dta=data.get(position);
         holder.checked.setId(position);
        Toast.makeText(ctxt, "Humayoon    zoooommmm"+dta.getNumber(), Toast.LENGTH_SHORT).show();

        for(int i=1; i<=256; i++)
        {
            holder.textName.setText(dta.getName());
        }
        for(int j=1; j<=256; j++)
        {
            holder.stnumber.setText(dta.getNumber());
        }
//      holder.btnEdit.setOnClickListener(new OnClickListener() {
//          
//          @Override
//          public void onClick(View v) {
//              Toast.makeText(ctxt, "Humayoon    Siddiqueeeeeeeeeeeeeeeeeee"+dta.getName(), Toast.LENGTH_SHORT).show();
//              Intent moreIntent=new Intent(getContext(),ContactList.class);
//              String tName=dta.getName();
//              moreIntent.putExtra("Template",tName);
//              v.getContext().startActivity(moreIntent);
//               // ctxt.startActivity(ctxt,ContactList.class);
//          }
//      });
        return row;
    }
    @Override
    public int getCount() {
//      // TODO Auto-generated method stub
        return data.size();
    }

    static class UserHolder {
        TextView textName;
        TextView textAddress;
        TextView textLocation;
        ImageButton btnEdit;
        Button btnDelete;
        TextView stnumber;
        CheckBox checked;
        }


}

My phoneList Class is ..

package com.example.sqliteapplication;

public class PhoneList {
    String name;
    String number;
    public PhoneList(String string,String number) {
        super();
        this.name = string;
        this.number=number;
    }
    public String getName() {
        return name;
        }
    public void setNumber(String number)
    {
        this.number=number;
    }
    public String getNumber()
    {
        return number;
    }
    public void setName(String name) {
        this.name = name;
        }



}

xml layout of List View

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@layout/bg_player_header"
    >
    <ListView android:layout_width="match_parent"
             android:divider="#FFEEEE" 
        android:layout_height="match_parent" android:id="@+id/lvContacts"></ListView>
</LinearLayout>

xml layout of each row in a List View

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/player_header_bg"
        android:layout_width="fill_parent"
        android:layout_height="60dip"
        android:background="@layout/bg_player_header" >

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="32dip"
            android:layout_height="40dip"
            android:layout_marginTop="10dip"
            android:src="@drawable/face" >
        </ImageView>
        <TextView
            android:id="@+id/lblName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="15dip"
            android:layout_weight="1"
            android:paddingLeft="5dp"
            android:text="Description"
            android:textColor="#04b3d2"
            android:textSize="16dp"
            android:textStyle="bold" />
        <TextView
            android:id="@+id/mobilenum"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="15dip"
            android:layout_weight="1"
            android:paddingLeft="5dp"
            android:text="03455039469"
            android:textColor="#04b3d2"
            android:textSize="16dp"
            android:textStyle="bold" />

        <CheckBox
            android:id="@+id/check"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_alignParentRight="true"
            android:focusable="false"
            android:src="@drawable/shape"
            />
    </LinearLayout>

</LinearLayout>

Error is following....

05-12 13:30:32.432: E/AndroidRuntime(25447): FATAL EXCEPTION: main
05-12 13:30:32.432: E/AndroidRuntime(25447): android.content.res.Resources$NotFoundException: Unable to find resource ID #0x4
05-12 13:30:32.432: E/AndroidRuntime(25447):    at android.content.res.Resources.getResourceEntryName(Resources.java:1756)
05-12 13:30:32.432: E/AndroidRuntime(25447):    at android.view.View$1.onClick(View.java:3590)
05-12 13:30:32.432: E/AndroidRuntime(25447):    at android.view.View.performClick(View.java:4211)
05-12 13:30:32.432: E/AndroidRuntime(25447):    at android.widget.CompoundButton.performClick(CompoundButton.java:100)
05-12 13:30:32.432: E/AndroidRuntime(25447):    at android.view.View$PerformClick.run(View.java:17446)
05-12 13:30:32.432: E/AndroidRuntime(25447):    at android.os.Handler.handleCallback(Handler.java:725)
05-12 13:30:32.432: E/AndroidRuntime(25447):    at android.os.Handler.dispatchMessage(Handler.java:92)
05-12 13:30:32.432: E/AndroidRuntime(25447):    at android.os.Looper.loop(Looper.java:153)
05-12 13:30:32.432: E/AndroidRuntime(25447):    at android.app.ActivityThread.main(ActivityThread.java:5299)
05-12 13:30:32.432: E/AndroidRuntime(25447):    at java.lang.reflect.Method.invokeNative(Native Method)
05-12 13:30:32.432: E/AndroidRuntime(25447):    at java.lang.reflect.Method.invoke(Method.java:511)
05-12 13:30:32.432: E/AndroidRuntime(25447):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
05-12 13:30:32.432: E/AndroidRuntime(25447):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
05-12 13:30:32.432: E/AndroidRuntime(25447):    at dalvik.system.NativeStart.main(Native Method)

回答1:


why you changed id of checkbox in your code?

 holder.checked.setId(position);   

if you want keep position in your checkbox use Tag instead of id

you can use:

holder.checked.setTag(position);

and for getting that:

int position = (Integer)holder.checked.getTag();

as you change id of checkbox in your code you get Resources$NotFoundException because you changed id of checkbox to 1,2,3,4,... and this not saved in R file,

// UPDATE

multiple select item happened because listviews-recycling, for solving this issue you need save selected position in one place or you can do:

add following property to PhoneList

boolean isSelected;

create getter and setter method for that.

public boolean getIsSelected()
{
  return isSelected;
}


public void setIsSelected(boolean isSelected)
{
   this.isSelected = isSelected;
}

then in your code in getView method use:

 holder.checked.setChecked(dta.getIsSelected());

and in click of checkbox change value of isSelected to !isSelected:

so your code must be like:

 holder.checked.setOnClickListener(this);

in onClick method:

 data.get((Integer)v.getTag()).setIsSelected(!data.get((Integer)v.getTag()).getIsSelected);
 notifyDataSetChanged();



回答2:


android.content.res.Resources$NotFoundException: will throw whenever you request a id which is not available for you.

The Layout which you inflating doesn't have id named check. So you need to check the XML file. If its not there include it. It will resolve your problem.

 `holder.checked=(CheckBox)row.findViewById(R.id.check);`



回答3:


Make this changes

 static class UserHolder {
        TextView textName;
        TextView textAddress;
        TextView textLocation;
        ImageButton btnEdit;
        Button btnDelete;
        TextView stnumber;
       //removed checkbox here
        }

and

 //Added checkbox here
 CheckBox checked;
 if(convertView==null)
        {
             LayoutInflater inflater = ((Activity) ctxt).getLayoutInflater();
             row = inflater.inflate(inflatr, parent, false);
             holder = new UserHolder();
             holder.textName=(TextView)row.findViewById(R.id.lblName);
             holder.stnumber=(TextView)row.findViewById(R.id.mobilenum);
//removed    holder.checked=(CheckBox)row.findViewById(R.id.check); this line
//           holder.btnEdit = (ImageButton) row.findViewById(R.id.atomPay_removePay);
             row.setTag(holder);
        }
        else
        {
             holder = (UserHolder) row.getTag();            
        } 


  //And added this line
    checked=(CheckBox)row.findViewById(R.id.check);  


来源:https://stackoverflow.com/questions/23603619/app-crashes-when-i-click-on-checkbox-in-contact-listview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!