0

I Have implemented the ListView with Custom Adopter class and Multiple check box selection . Its working fine . After that I have given search the name in ListView. If I checked row item then I search the name in search , Search positioned was changed . Kindly help me to fix this.

Model Class

    public class FullUser {
    String name=null;
    String id=null;
    boolean checked;
    public FullUser(String name, String id,boolean checked){
        this.name=name;
        this.id = id;
        this.checked = checked;

    }
    public String getName(){
        return this.name;
    }
    public void setName(String name){
        this.name = name;
    }
    public String getId(){
        return this.id;
    }
    public void setId(String id){
        this.id = id;
    }

    public Boolean getChecked(){
        return this.checked;
    }
    public void setChecked(Boolean checked){
        this.checked = checked;
    }

    @Override
    public String toString() {
        return  this.name;

    }
}

Adapter Class

    public class FullUserAdapter extends ArrayAdapter<FullUser> {
    private ArrayList<FullUser> originalList;
    private ArrayList<FullUser> fullUsers;
    private SubjectFilter filter;


    public FullUserAdapter(Context context, int resource, ArrayList<FullUser> fullUsers) {
        super(context, resource, fullUsers);
        this.fullUsers = new ArrayList<FullUser>();
        this.fullUsers.addAll(fullUsers);
        this.originalList = new ArrayList<FullUser>();
        this.originalList.addAll(fullUsers);

    }


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

    @Override
    public FullUser getItem(int position) {
        return fullUsers.get(position);
    }

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

    @Override
    public Filter getFilter() {
        if (filter == null){
            filter  = new SubjectFilter();
        }
        return filter;
    }
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        ViewHolder holder = null;
        Log.v("UserConvertView", String.valueOf(position));

        View row;
        if (convertView == null) {
            row = LayoutInflater.from(getContext()).inflate(R.layout.list_row_with_checkbox, parent, false);
        }else{
            row = convertView;
        }
        holder = new ViewHolder();
        holder.name_view = (TextView) row.findViewById(R.id.nameText);
        holder.firstchar_view = (TextView) row.findViewById(R.id.first_char);
        holder.groupid = (TextView) row.findViewById(R.id.rowid);
        holder.checkBox =(CheckBox) row.findViewById(R.id.cbBox);

        final FullUser group =getItem(position);
        holder.groupid.setText(group.getId());

        //holder.checkBox.setChecked(checkedHolder[position]);

        String communityname_text = group.getName();
        holder.name_view.setText(group.getName());
        String firstchar = communityname_text.substring(0, 1);
        holder.firstchar_view.setText(firstchar);


         holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                if(isChecked == true)
                group.setChecked(true);
                else
                    group.setChecked(false);

            }
        });


        row.setTag(holder);

        return row;
    }



    private class SubjectFilter extends Filter
    {

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults result = new FilterResults();
            if(constraint != null && constraint.toString().length() > 0)
            {
                constraint = constraint.toString().toLowerCase();
                ArrayList<FullUser> filteredItems = new ArrayList<FullUser>();

                for(int i = 0, l = fullUsers.size(); i < l; i++)
                {
                    FullUser group = fullUsers.get(i);
                    if(group.toString().toLowerCase().contains(constraint)) {
                        FullUser grouplistss = new FullUser(group.getName(),group.id,group.getChecked());
                        filteredItems.add(grouplistss);

                    }
                }
                result.count = filteredItems.size();
                result.values = filteredItems;
            }
            else
            {
                synchronized(this)
                {
                    result.values = originalList;
                    result.count = originalList.size();
                }
            }
            return result;
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint,Filter.FilterResults results) {

            if(results.count > 0) {
                fullUsers = (ArrayList<FullUser>)results.values;
                notifyDataSetChanged();
                clear();
                for(int i = 0, l = fullUsers.size(); i < l; i++)
                    add(fullUsers.get(i));

            } else {
                notifyDataSetInvalidated();
            }
        }
    }

    private class ViewHolder {
        TextView name_view;
        TextView firstchar_view;
        TextView groupid;
        CheckBox checkBox;
    }
}

Thanks in advance.

4
  • by using filterable you can't do this Commented Sep 8, 2016 at 7:41
  • Thank you so much for your reply . Is there any option to do search and select check box . Commented Sep 8, 2016 at 7:43
  • "Search positioned was changed" what was changed? Commented Sep 8, 2016 at 7:49
  • that means, if i choose the first row item, then search any of the row automatically last of row item choosed . Commented Sep 8, 2016 at 7:52

3 Answers 3

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

          if(isChecked){

             group.setChecked(true);
             int pos = originalList.indexOf(group)
             originalList.get(pos).setChecked(true);
             fullUsers.get(position).setChecked(true);
           }else{

            group.setChecked(false);
            int pos = originalList.indexOf(group)
             originalList.get(pos).setChecked(true);
            fullUsers.get(position).setChecked(false);
           }

        }
Sign up to request clarification or add additional context in comments.

3 Comments

While filter time automatically checked position changed to search result row item .
Is there any other ways to do , like search list view and list view should have option for checkbox . Thank you so much . please let me know .
Can u please let me know the other way ? any sample link pls send to me . Thank u so much
0

update your adapter use SparseBooleanArray

    public class FullUserAdapter extends ArrayAdapter<FullUser> {
    private ArrayList<FullUser> originalList;
    private ArrayList<FullUser> fullUsers;
    private SubjectFilter filter;
    SparseBooleanArray booleanArray ;


    public FullUserAdapter(Context context, int resource, ArrayList<FullUser> fullUsers) {
        super(context, resource, fullUsers);
        this.fullUsers = new ArrayList<FullUser>();
        this.fullUsers.addAll(fullUsers);
        this.originalList = new ArrayList<FullUser>();
        this.originalList.addAll(fullUsers);
        booleanArray = new SparseBooleanArray();

    }


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

        .
        .
        .

        final FullUser group =getItem(position);
        holder.groupid.setText(group.getId());
        holder.checkBox.setOnCheckedChangeListener(null);
        holder.checkBox.setChecked(booleanArray.get(group.getId().hashCode(),false));
         holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            booleanArray.put(group.getId().hashCode(), isChecked);
            }
        });
        .
        .
        .
        return row;
    }

   public ArrayList<FullUser> getSelectedItems() {
         ArrayList<FullUser> list  = new ArrayList<>();
         for(FullUser group:fullUsers){
             if(booleanArray.get(group.getId().hashCode(), false)){
                 list.add(group);
             }
         }
         return list;

    };

    }

1 Comment

Hi ,Still I am struggling to get the selected check box values . May i know how can i extract the selected check box . thank you so much for ur kind reply .
0
      <?xml version="1.0" encoding="utf-8"?>
     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      tools:context=".dashboard.VoterListActivity">

<ProgressBar
    android:id="@+id/reqprogressbar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:visibility="gone" />


<ListView
    android:id="@+id/voter_lv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@+id/btn_show_me"
    android:divider="@null"/>

<Button
    android:id="@+id/btn_show_me"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp"
    android:layout_marginBottom="5dp"
    android:background="@drawable/n_btn"
    android:text="@string/add_family_numbers"
    android:visibility="gone"
    android:textColor="#ffffff"
    android:textSize="20sp" />

   </RelativeLayout>

Java Code

public Class  Actvity extends AppCompatActivity {
ProgressBar progressBar;
ListView listView;
VoterDao voterDao;
String Token, Userid, Appid, Deviceid;
MenuItem searchview;
VoterListAdapter adapter;

String pid;
VoterDatum friend;
String value;
CheckBox mCheckBox;
Button btn_show_me;
ArrayList<VoterDatum> friends;
ListView1Adapter adapter1;
VoterDatum Model;
StringBuilder stringBuilder;
String name;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_voter_list);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setTitle(R.string.voter_list);
    stringBuilder = new StringBuilder();
    Token = Util.getStringFromSP(this, "token");
    Userid = Util.getStringFromSP(this, "user_id");
    Appid = Util.getStringFromSP(this, "app_id");
    Deviceid = Util.getStringFromSP(this, "device_id");

    initViews();
    getVoterData();

    btn_show_me.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            int i = 0;
            if (friends.size() == i) { //do nothing
            }
            while (friends.size() > i) {
                int count = friends.size();
                Model = friends.get(i);

                if (Model.isChecked()) {
                    Log.i("ListActivity", "here" + friends.get(i).getCitizenId());
                    stringBuilder.append("," + friends.get(i).getCitizenId());
                    name = stringBuilder.toString();
                    String joinedString = Model.getCitizenId().toString();
                    Log.d("ls", "" + name);
                    name = name.substring(1);
                    Log.d("fs", name);
                    sendToServer();

                }


                i++; // rise i
            }


        }
    });
}

private void sendToServer() {

    Intent intent = new Intent(VoterListActivity.this, AddFamilyNuberByVoterList.class);
    intent.putParcelableArrayListExtra("CheckedList", friends);
    startActivity(intent);
    finish();


}


private void getVoterData() {
    if (Util.isNetworkAvailable(this)) {
        progressBar.setVisibility(View.VISIBLE);
        SendRequestToServer();
    } else {
        progressBar.setVisibility(View.GONE);
        Snackbar.make(listView, R.string.no_connection, Snackbar.LENGTH_SHORT).show();
        return;
    }
}

private void SendRequestToServer() {
    try {
        RegistrationApi api = ServiceGenerator.createService(RegistrationApi.class);
        retrofit2.Call<VoterDao> call = api.togetVoters(Userid, Token, Appid, Deviceid);
        call.enqueue(new Callback<VoterDao>() {
            @Override
            public void onResponse(Call<VoterDao> call, Response<VoterDao> response) {
                if (response.isSuccessful()) {
                    voterDao = response.body();
                    if (voterDao.getAddData().getStatus().equals(1)) {
                        searchview.setVisible(true);
                        progressBar.setVisibility(View.GONE);
                        friends = (ArrayList<VoterDatum>) voterDao.getAddData().getData();


                        adapter1 = new ListView1Adapter(getApplicationContext(), R.layout.list_voter, friends);
                        listView.setAdapter(adapter1);
                        btn_show_me.setVisibility(View.VISIBLE);

                    } else {
                        searchview.setVisible(false);
                        progressBar.setVisibility(View.GONE);
                        Snackbar.make(listView, R.string.no_data_found, Snackbar.LENGTH_SHORT).show();
                    }
                } else {
                    searchview.setVisible(false);
                    progressBar.setVisibility(View.GONE);
                    Snackbar.make(listView, R.string.no_data_found + response.message(), Snackbar.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onFailure(Call<VoterDao> call, Throwable t) {
                try {
                    searchview.setVisible(false);
                    progressBar.setVisibility(View.GONE);
                    Snackbar.make(listView, "" + t.getMessage(), Snackbar.LENGTH_SHORT).show();
                    Log.d("message", "" + t.getMessage());
                    System.out.println("onFAilureExecute" + t.getMessage());
                    if (t != null)
                        t.printStackTrace();
                } catch (Throwable th) {
                    th.printStackTrace();
                }

            }
        });


    } catch (Exception e) {
        e.printStackTrace();
    }
}


private void initViews() {
    progressBar = findViewById(R.id.reqprogressbar);
    listView = findViewById(R.id.voter_lv);
    btn_show_me = findViewById(R.id.btn_show_me);
}

@Override
public boolean onSupportNavigateUp() {
    startActivity(new Intent(getApplicationContext(), DashboardActivity.class));

    finish();
    overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
    return true;
}

@Override
public void onBackPressed() {
    startActivity(new Intent(getApplicationContext(), DashboardActivity.class));
    finish();
    overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    searchview = menu.findItem(R.id.action_search);
    final SearchView searchViewAndroidActionBar = (SearchView) MenuItemCompat.getActionView(searchview);

    searchViewAndroidActionBar.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return true;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            adapter1.getFilter().filter(newText);
            return false;
        }
    });
    View closeButton = searchViewAndroidActionBar.findViewById(android.support.v7.appcompat.R.id.search_close_btn);
    closeButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //handle click

            searchViewAndroidActionBar.setIconified(true);
        }
    });
    return super.onCreateOptionsMenu(menu);
}


@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(LocalHelper.onAttach(base));
}

private class ListView1Adapter extends BaseAdapter {
    ListView1Adapter.ViewHolder holder;
    private Context activity;
    private ArrayList<VoterDatum> Friends;
    private ArrayList<VoterDatum> mList;
    private final String TAG = ListViewAdapter.class.getSimpleName();
    boolean[] checkedItems;


    public ListView1Adapter(Context applicationContext, int list_voter, ArrayList<VoterDatum> list) {

        this.activity = applicationContext;
        this.Friends = list;
        this.mList = list;
        Log.i(TAG, "init adapter");
        checkedItems = new boolean[mList.size()];
    }

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

    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }


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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        holder = null;
        final int pos = position;

        // inflate layout from xml
        LayoutInflater inflater = (LayoutInflater) activity
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

        // If holder not exist then locate all view from UI file.
        if (convertView == null) {
            // inflate UI from XML file
            convertView = inflater.inflate(R.layout.list_voter, parent, false);
            // get all UI view
            holder = new ListView1Adapter.ViewHolder(convertView);
            // set tag for holder
            convertView.setTag(holder);
        } else {
            // if holder created, get tag from view
            holder = (ListView1Adapter.ViewHolder) convertView.getTag();
        }

        friend = mList.get(position);
        String nameS = friend.getFirstname() + " " + friend.getLastname();
        String namesS = friend.getVoterId();
        String lname = friend.getLfname() + " " + friend.getLlastname();
        //set Friend data to views
        String Photo = friend.getPhoto();
        if (Photo.isEmpty() || Photo == null) {
            holder.image.setImageResource(R.mipmap.ic_launcher);
        } else {
            Picasso.with(activity).load(Photo).transform(new CircleTransform()).into(holder.image);
        }

        holder.name.setText(nameS);
        holder.lanname.setText(lname);
        holder.voterid_tv.setText(namesS);

        holder.check.setChecked(friend.isChecked());
        holder.check.setTag(friend);
        holder.check.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                CheckBox cb = (CheckBox) v;
                VoterDatum itemobj = (VoterDatum) cb.getTag();


                if (mList.get(Integer.valueOf(pos)).isChecked()) {
                    cb.setSelected(false);
                    mList.get(Integer.valueOf(pos)).setIsChecked(false);
                    notifyDataSetChanged();


                } else {
                    cb.setSelected(true);
                    mList.get(Integer.valueOf(pos)).setIsChecked(true);
                    notifyDataSetChanged();
                }
            }
        });
        return convertView;
    }

    private class ViewHolder {
        private ImageView image;
        private TextView name, lanname, voterid_tv;
        private CheckBox check;

        public ViewHolder(View v) {
            image = v.findViewById(R.id.profile_iv);
            name = (TextView) v.findViewById(R.id.name_tv);
            lanname = (TextView) v.findViewById(R.id.desig_tv);
            voterid_tv = (TextView) v.findViewById(R.id.voterid_tv);
            check = (CheckBox) v.findViewById(R.id.chkEnable);
        }
    }

    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults results = new FilterResults();

                ArrayList<VoterDatum> filteredResults = null;

                if (constraint.length() == 0) {
                    filteredResults = Friends;
                } else {
                    filteredResults = (ArrayList<VoterDatum>) getFilteredResults(constraint.toString().toLowerCase());
                }


                results.values = filteredResults;

                return results;
            }

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults results) {
                mList = (ArrayList<VoterDatum>) results.values;
                notifyDataSetChanged();
            }
        };
    }

    protected List<VoterDatum> getFilteredResults(String s) {
        ArrayList<VoterDatum> results = new ArrayList<>();
        for (VoterDatum item : Friends) {
            String TotalSearch = item.getFirstname() + " " + item.getLastname();
            if (TotalSearch.toLowerCase().contains(s) || item.getVoterId().toLowerCase().contains(s)) {
                results.add(item);
            }

        }
        return results;

    }

    public ArrayList<VoterDatum> getAllData() {
        return mList;
    }
}
}

Model Class

   public class VoterDatum implements Parcelable {

 @SerializedName("citizen_id")
@Expose
private String citizenId;
private boolean isChecked;
public static final Parcelable.Creator<VoterDatum> CREATOR = new Parcelable.Creator<VoterDatum>() {
    public VoterDatum createFromParcel(Parcel in) {
        return new VoterDatum(in);
    }

    public VoterDatum[] newArray(int size) {
        return new VoterDatum[size];
    }
};


public VoterDatum(Parcel in) {
    this.citizenId = in.readString();

    this.isChecked = in.readByte() != 0;
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(this.citizenId);

    dest.writeByte((byte) (this.isChecked ? 1 : 0));
}

public VoterDatum(String citizenId, boolean gender) {
    this.citizenId = citizenId;
    this.isChecked = false; // not selected when create
}


@SerializedName("status")
@Expose
private String status;

@SerializedName("firstname")
@Expose
private String firstname;
@SerializedName("lastname")

public boolean isChecked() {
    return isChecked;
}


public void setIsChecked(boolean isChecked) {
    this.isChecked = isChecked;
}

public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}

public String getCitizenId() {
    return citizenId;
}

public void setCitizenId(String citizenId) {
    this.citizenId = citizenId;
}

public String getFirstname() {
    return firstname;
}

public void setFirstname(String firstname) {
    this.firstname = firstname;
}

public String getLastname() {
    return lastname;
}

public void setLastname(String lastname) {
    this.lastname = lastname;
}

public String getLfname() {
    return lfname;
}

public void setLfname(String lfname) {
    this.lfname = lfname;
}

}

Get Data From Other Class

public class ACtivity extends AppCompatActivity implements View.OnClickListener {
String Mvoterid;
GPSTracker gps;
String Token, Userid, Deviceid, Appid, Language;
Button submit_btn;
ProgressBar progressBar;
AddFamilynumberbyvoterDao addFamilynumberbyvoterDao;
//  ArrayList<VoterDatum> checkedList;
List<VoterDatum> checkedList;
LinearLayout container;
VoterDatum Model;
ListView list_item;
String join;
int position;
String userName;
String name;
StringBuilder stringBuilder;
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_family_nuber_by_voter_list);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setTitle(R.string.add_family_numbers);
    VoterID = getIntent().getStringExtra("voterIDs");
    stringBuilder= new StringBuilder();
     checkedList = new ArrayList<VoterDatum>(); // initializing list
    container = (LinearLayout) findViewById(R.id.layout);


    getLocation();

    initViews();
    initListeners();
    getDataFromIntent();
    generateDataToContainerLayout();


}

@RequiresApi(api = Build.VERSION_CODES.O)
@SuppressLint("InflateParams")
private void generateDataToContainerLayout() {

    int i = 0;
    if (checkedList.size() == i) { //do nothing
    }
    while (checkedList.size() > i) {
        int count = checkedList.size();
        Model = checkedList.get(i);

        if (Model.isChecked()) {
            Log.i("ListActivity", "here" + checkedList.get(i).getCitizenId());



            stringBuilder.append(","+checkedList.get(i).getCitizenId());
            name=stringBuilder.toString();



            String joinedString = Model.getCitizenId().toString();
            Log.d("ls", "" + name);
            name=name.substring(1);
            Log.d("fs",name);
        }


        i++; // rise i
    }

}

private void getDataFromIntent() {
    checkedList = getIntent().getParcelableArrayListExtra("CheckedList");

}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.