簡體   English   中英

有沒有辦法在撥號盤中打開每個可搜索的列表視圖項?

[英]Is there a way of opening each searchable listview item in a dial pad?

我是 android 開發的新手,我設法開發了一個應用程序,其中包含名稱、電話號碼和地區的列表視圖,它是可搜索的,並且運行良好。 我使用位置單擊並將我帶到撥號盤,但問題是,如果搜索了一個項目,它不會保持最初給它的位置。 當用戶搜索名稱或地區時,我想要什么,它會在撥號盤中打開,上面寫着一個數字。 這是我的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);
            

和 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>

還有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>

您需要使用帶有TextView的自定義Array Adapter和自定義Layout ,並為每個TextView添加OnClickListener

我已經更改了您的代碼以使其正常工作。

聯系人.java

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;
import android.widget.SearchView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.List;

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
        if (getSupportActionBar() != null) {
            getSupportActionBar().setTitle("DFO Contacts");
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        }

        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");
        name.add("Agaja joseph - kaberamaido - 0775004193");
        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);

    }
}

CustomAdapter.java

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;

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);

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

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

        // Here we will try to extract phone number from current item
        // it looks like    xxxxx - xxxxx - 1234567890
        // or like          xxxxx - xxxxx -xxxxxx - 1234567890
        // we need to extract 1234567890 here
        // we will split by "-" & last one in array will be the phone number
        // you may try another way to get so

        String[] s = item.split("-");
        String p = s[s.length-1].trim();    // Extracted Phone Number

        viewHolder.txtName.setOnClickListener(view -> {
            Intent intent = new Intent(Intent.ACTION_DIAL);
            intent.setData(Uri.parse("tel: " + p));
            mContext.startActivity(intent);
        });

        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);
    }

}

菜單.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:icon="?android:attr/actionModeWebSearchDrawable"
        android:title="Search"
        app:actionViewClass="android.widget.SearchView"
        app:showAsAction="always" />
</menu>

activity_main.xml

<?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">

    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginStart="15dp"
        android:clickable="true"
        android:textSize="20sp"
        tools:listitem="@android:layout/simple_list_item_1"
        android:focusable="true" />

</LinearLayout>

希望它會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM