[英]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.