0

im new to android development and i have managed to develop an application with a listview of name, phone number and district, which is searchable and it is working really well. im using positions to click and take me to the dial pad, but the problem is, if an item is searched, it does not mantain its position given to it initially. what i want when a user searches for a name or district, it opens in the dial pad with a number written there. Here is my contacts.java

public class Contacts extends AppCompatActivity {
    ListView listView;
    String[] name = {"Achibu john peter - Serere - 0772698033", "Agaba - Amon - Rukiga - 
     0782090694\n", "Agaja joseph - kaberamaido - 0775004193/0752451894\n",}
     ArrayAdapter<String> arrayAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contacts);

        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setTitle("DFO Contacts");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        listView = findViewById(R.id.listview);


        arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, name);
        listView.setAdapter(arrayAdapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
                if (position == 0){
                    Intent intent = new Intent(Intent.ACTION_DIAL);
                      intent.setData(Uri.parse("tel: +256772698033"));
                      startActivity(intent);
                }
            }
        });


    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        getMenuInflater().inflate(R.menu.menu, menu);
        MenuItem menuItem = menu.findItem(R.id.action_search);

        SearchView searchView = (SearchView) menuItem.getActionView();
        searchView.setQueryHint("Search for your DFO");

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

            @Override
            public boolean onQueryTextChange(String newText) {
                arrayAdapter.getFilter().filter(newText);
                return false;
            }
        });
        return super.onCreateOptionsMenu(menu);
            

and menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/search_view"
        android:title="Search"
        app:showAsAction="always"
        android:icon="@drawable/ic_search"
        app:actionViewClass="android.widget.SearchView"

        />
</menu>

And the activity_contacts

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".Contacts">



    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#D4AC0D"
        app:subtitleTextColor="#0A0A0A"
        app:titleTextColor="#111111"
         />

    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fontFamily="@font/poppinsmedium"
        android:textSize="20sp"
        android:layout_marginLeft="15dp"
        android:clickable="true"
        />


</LinearLayout>
Federico klez Culloca
  • 24,336
  • 15
  • 57
  • 93
  • Does this answer your question? [Is there a way to get the source code from an APK file?](https://stackoverflow.com/questions/3593420/is-there-a-way-to-get-the-source-code-from-an-apk-file) – gutyina70 Jun 02 '22 at 09:23
  • No @Federico, all i want is that when you click on any seachable item, it takes you to the dial pad, without using positions – Iradukunda Reyanne Jun 02 '22 at 09:30
  • @IradukundaReyanne you need to use filterable in your adapter while search, so that it will give proper arraylist with positions. – Bhoomika Patel Jun 02 '22 at 09:37
  • please show me an example using the contacts java i have provided, thankyou @BhoomikaPatel – Iradukunda Reyanne Jun 02 '22 at 10:04
  • @IradukundaReyanne "no" what? I didn't ask anything, I just reformatted your question. – Federico klez Culloca Jun 02 '22 at 10:17
  • @IradukundaReyanne check this answer, and customize your adapter. https://stackoverflow.com/a/20743661/6534707 – Bhoomika Patel Jun 02 '22 at 10:34
  • searching is fine, it works perfectly well, but i want it to search and on click of the searched item you go to the dail pad of the phone, each list item to have its own dial pad – Iradukunda Reyanne Jun 02 '22 at 10:53
  • @IradukundaReyanne, You need to use custom ```Array Adapter``` with custom ```Layout``` with a ```TextView``` and add ```OnClickListener``` for each ```TextView```. – Gouranga Das Jun 03 '22 at 15:58

1 Answers1

0

You need to use custom Array Adapter with custom Layout with a TextView and add OnClickListener for each TextView.

I've changed your code to make it work.

contacts.java

public class Contacts extends AppCompatActivity {

    ListView listView;
    List<String> name;
    CustomAdapter arrayAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Set Toolbar & title

        listView = findViewById(R.id.listview);

        // Creating List<String> from valus
        name = new ArrayList<>();
        name.add("Achibu john peter - Serere - 0772698033");
        name.add("Agaba - Amon - Rukiga - 0782090694\n");
        name.add("Agaja joseph - kaberamaido - 0775004193/0752451894\n");
        arrayAdapter = new CustomAdapter(name, this);
        listView.setAdapter(arrayAdapter);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);
        MenuItem menuItem = menu.findItem(R.id.search_view);

        SearchView searchView = (SearchView) menuItem.getActionView();
        searchView.setQueryHint("Search for your DFO");

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

            @Override
            public boolean onQueryTextChange(String newText) {
                arrayAdapter.getFilter().filter(newText);
                return false;
            }
        });
        return super.onCreateOptionsMenu(menu);

    }
}

and CustomAdapter.java

public class CustomAdapter  extends ArrayAdapter<String> {

    private final LayoutInflater mInflater;
    private final int mResource;
    private Context mContext;
    private List<String> orig;
    private List<String> dataSet;
    private int selectedPosition;

    public CustomAdapter(List<String> data, Context context) {
        super(context, android.R.layout.simple_list_item_1, data);

        mContext = context;

        // We need to make backup of original list

        dataSet = data;
        orig = data;

        // Store for later use

        mInflater = LayoutInflater.from(context);
        mResource = android.R.layout.simple_list_item_1;

    }


    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        return createItemView(position, convertView, parent);
    }

    private View createItemView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;

        if (convertView == null) {

            viewHolder = new ViewHolder();
            convertView = mInflater.inflate(mResource, parent, false);
            viewHolder.txtName = convertView.findViewById(android.R.id.text1);
            convertView.setTag(viewHolder);

            String item = getItem(position);
            viewHolder.txtName.setText(item);

            // Here, we will add OnClickListener
 
            viewHolder.txtName.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    //Extract phone number from item

                    Intent intent = new Intent(Intent.ACTION_DIAL);
                    intent.setData(Uri.parse("tel: +256772698033"));
                    mContext.startActivity(intent);
                }
            });

        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        return convertView;
    }


    // View lookup cache
    private static class ViewHolder {
        TextView txtName;
    }

    public Filter getFilter() {
        return new Filter() {

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                final FilterResults oReturn = new FilterResults();
                final ArrayList<String> results = new ArrayList<String>();
                if (orig == null)
                    orig = dataSet;
                if (constraint != null) {
                    if (orig != null && orig.size() > 0) {
                        for (final String g : orig) {
                            if (g.toLowerCase()
                                    .contains(constraint.toString()))
                                results.add(g);
                        }
                    }
                    oReturn.values = results;
                }
                return oReturn;
            }

            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence constraint,
                                          FilterResults results) {
                dataSet = (List<String>) results.values;
                notifyDataSetChanged();
            }
        };
    }

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

    @Override
    public String getItem(int position) {
        return dataSet.get(position);
    }

}

Hope it will help.