Search code examples
androidxmlbaseadapterlistadapter

how to handle filtered list click listner on class exending baseadapter?


every one! I am a new bie in android...In my app after clicking the button on fragment I switch to new Activity which shows the list then I filtered the list and now I want to get details of selected filtered list item back to calling fragment...I tried for onClick Listener in the getView method of adapter class which extends base adapter but it not switch to calling fragment..it remains there only

My Adapter classs

public class user_list_Adapter extends BaseAdapter {
    private Context context;
    public static ArrayList<user_list_item> user_arraylist;
    private ArrayList<user_list_item> arraylist;
    public static String selected_code;

    public user_list_Adapter(Context context, ArrayList<user_list_item> user_array) {
        this.context = context;
        this.user_arraylist = user_array;
        this.arraylist = new ArrayList<user_list_item>();
        this.arraylist.addAll(user_array);

    }

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

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

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

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

        if (convertView == null) {
            LayoutInflater mInflater = (LayoutInflater)
                    context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.user_row, null);
        }

        TextView txtname = (TextView) convertView.findViewById(R.id.dname);
        TextView txtcode = (TextView) convertView.findViewById(R.id.dcode);

        txtname.setText(user_arraylist.get(position).getCust_name());
        txtcode.setText(user_arraylist.get(position).getCode());

        // Listen for ListView Item Click
        convertView.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
              Deposite df = new Deposite();
            MainActivity activity = (MainActivity) context; //this line gives class cast exception
            FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction();
            Bundle b = new Bundle();
            b.putString("search_name ", search_name);
            b.putString("search_code ", search_code);
            df.setArguments(b);
            transaction.replace(R.id.content_frame, df);
            transaction.addToBackStack(null);
            transaction.commit();
                    }
        });

        return convertView;
    }


    // Filter Class
    public void filter(String charText) {
        charText = charText.toLowerCase(Locale.getDefault());
        user_arraylist.clear();
        if (charText.length() == 0) {
            user_arraylist.addAll(arraylist);
        }
        else
        {
            for (user_list_item item : arraylist)
            {
                if (item.getCust_name().toLowerCase(Locale.getDefault()).contains(charText))
                {
                    user_arraylist.add(item);
                }

                if (item.getCode().toLowerCase(Locale.getDefault()).contains(charText))
                {
                    user_arraylist.add(item);
                }
            }
        }
        notifyDataSetChanged();
    }

}

Solution

  • My Adpater class with inner class filter

    public class user_list_Adapter extends ArrayAdapter<user_list_item> implements Filterable 
    {
    
        private Filter mfilter;
        private Context context;
        private ArrayList<user_list_item> filter_user_list;
        private ArrayList<user_list_item> alluserlist;
        //public static String selected_code;
    
        public user_list_Adapter(Context context, ArrayList<user_list_item> user_array) {
            super(context,R.layout.user_row,user_array);
            this.context = context;
            this.filter_user_list = user_array;
            this.alluserlist = new ArrayList<user_list_item>();
            this.alluserlist.addAll(user_array);
    
        }
    
        @Override
        public int getCount() {
            return filter_user_list.size();
        }
    
        @Override
        public user_list_item getItem(int position) {
    
            return filter_user_list.get(position);
        }
    
        @Override
        public long getItemId(int position) {
    
           return filter_user_list.get(position).hashCode();
        }
    
        public void resetData() {
            filter_user_list = alluserlist;
        }
    
    
        /* *********************************
         * We use the holder pattern
         * It makes the view faster and avoid finding the component
         * **********************************/
    
        private static class UserHolder {
            public TextView txtname;
            public TextView txtcode;
        }
    
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
    
            UserHolder uholder=new UserHolder();
    
            // First let's verify the convertView is not null
            if (convertView == null) {
                // This a new view we inflate the new layout
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.user_row, null);
                // Now we can fill the layout with the right values
                TextView tvname = (TextView) convertView.findViewById(R.id.dname);
                TextView tvcode = (TextView) convertView.findViewById(R.id.dcode);
    
    
                uholder.txtname = tvname;
                uholder.txtcode = tvcode;
    
                convertView.setTag(uholder);
            }
            else
                uholder = (UserHolder) convertView.getTag();
    
            user_list_item p = filter_user_list.get(position);
            uholder.txtname.setText(p.getCust_name());
            uholder.txtcode.setText(p.getCode());
    
            return convertView;
        }
    
            /*
         * We create our filter
         */
    
        @Override
        public Filter getFilter() {
            if (mfilter == null)
                mfilter = new userFilter();
    
            return mfilter;
        }
    
        private class userFilter extends Filter {
    
           @Override
            protected FilterResults performFiltering(CharSequence charText) {
                FilterResults results = new FilterResults();
                // We implement here the filter logic
                if (charText == null || charText.length() == 0) {
                    // No filter implemented we return all the list
                    results.values = alluserlist;
                    results.count = alluserlist.size();
                }
                else {
                    // We perform filtering operation
                    List<user_list_item> uList = new ArrayList<user_list_item>();
    
                    for (user_list_item p : filter_user_list) {
                        if (p.getCust_name().toLowerCase(Locale.getDefault()).contains(charText)) {
                        uList.add(p);
                    }
    
                        if (p.getCode().toLowerCase(Locale.getDefault()).contains(charText)) {
                        uList.add(p);
                    }
                    }
    
                    results.values = uList;
                    results.count = uList.size();
    
                }
                return results;
            }
    
            @Override
            protected void publishResults(CharSequence constraint,
                                          FilterResults results) {
    
                // Now we have to inform the adapter about the new list filtered
                if (results.count == 0)
                    notifyDataSetInvalidated();
                else {
    
                    filter_user_list = (ArrayList<user_list_item>) results.values;
                    notifyDataSetChanged();
                }
    
            }
    
        }
    
        }
    

    In My search_window Activity class ie.List class which calls adapter class set onItemclick listener as

     // Binds the Adapter to the ListView
    
     list.setAdapter(adapter);
    
           list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long l) {
    
                    // We know that each row in the adapter is a Map
                    user_list_item row =  adapter.getItem(position);
                    //Toast.makeText(getApplicationContext(),"You Clicked On.."+row.getCust_name(),Toast.LENGTH_LONG).show();
                    MainActivity.deposite_search_flag = true;     //global static variable 
                    MainActivity.search_name = row.getCust_name(); //global 
                    MainActivity.search_code =row.getCode();     //global 
                    for (int i=0;i<RecordList.size();i++){  //user_list_item only contains name n code
                        if (row.getCode()==Code_Array[i]){
                            MainActivity.search_available = avail_bal_Array[i];
                        }
                    }
                    finish();  //switch to caller fragment and executes OnResume method of fragment
                }
            });
    

    by setting global variables on MainActivity class I switched to caller fragment by directly finishing this activity(finish();)

    //In caller fragment class
     @Override
        public void onResume() {
            super.onResume();
            if (MainActivity.deposite_search_flag){
                txtname.setText(MainActivity.search_name);
                txtcode.setText(MainActivity.search_code);
                txt_available_bal.setText(MainActivity.search_available);
            }
        }