【发布时间】:2014-04-24 16:16:51
【问题描述】:
有一个ArrayAdapter 和两个TextView。
将其设置为ListView 时,它工作正常,但是当我对其进行排序时,
它根据名称排序,但持有数字的TextView 不会相应地改变它们的位置。
如果我不应用排序并尝试使用数字过滤姓名,则仅显示初始联系人,而不是显示我想要的联系人。
这是我的自定义适配器:-
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
public class CustomListAdapter extends ArrayAdapter<String>{
private final Activity context;
private final String[] name;
private final String[] number;
public CustomListAdapter(Activity context, String[] name, String[] number) {
super(context, R.layout.name_num_list, name);
this.context=context;
this.name=name;
this.number=number;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View rowView= inflater.inflate(R.layout.name_num_list, null, true);
TextView txt_name = (TextView) rowView.findViewById(R.id.txt_name);
txt_name.setText(name[position]);
TextView txt_num= (TextView) rowView.findViewById(R.id.txt_number);
txt_num.setText(number[position]);
return rowView;
}
}
这是我的列表活动....
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.hardware.Camera;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.ListView;
public class ContactListActivity extends Activity implements OnItemClickListener{
String phoneNumber;
String name;
String[] namePerson;
String[] phoneNumberP;
ListView lv;
EditText searchContact;
CustomListAdapter customAdapter;
ArrayList <String> aa= new ArrayList<String>();
ArrayList <String> aa1= new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.contact_list);
searchContact=(EditText) findViewById(R.id.EditText_contact_search);
lv= (ListView) findViewById(R.id.lv);
getNumber(this.getContentResolver());
lv.setOnItemClickListener(this);
searchContact();
}
public void getNumber(ContentResolver cr)
{
Cursor phones = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null);
while (phones.moveToNext())
{
name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
aa.add(name);
aa1.add(phoneNumber);
}
phones.close();// close cursor
phoneNumberP=aa1.toArray(new String[aa1.size()]);
namePerson=aa.toArray(new String[aa.size()]);
customAdapter= new CustomListAdapter(ContactListActivity.this, namePerson, phoneNumberP);
customAdapter.sort(new Comparator<String>() {
@Override
public int compare(String arg1, String arg0) {
return arg1.compareTo(arg0);
}
});
customAdapter.notifyDataSetChanged();
lv.setAdapter(customAdapter);
}
@Override
public void onItemClick(AdapterView<?> av, View v, int pos, long arg3) {
}
private void searchContact() {
lv.setTextFilterEnabled(true);
searchContact.addTextChangedListener(new TextWatcher()
{
@Override
public void onTextChanged( CharSequence arg0, int arg1, int arg2, int arg3)
{
}
@Override
public void beforeTextChanged( CharSequence arg0, int arg1, int arg2, int arg3)
{
}
@Override
public void afterTextChanged( Editable name)
{
ContactListActivity.this.customAdapter.getFilter().filter(name);
customAdapter.notifyDataSetChanged();
}
});
}
}
我的 xml 是...
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/txt_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp" />
<TextView
android:id="@+id/txt_number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="12sp" />
</LinearLayout>
对于列表
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/preview6" >
<LinearLayout
android:id="@+id/main_ll_contactlist"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@drawable/bg_black">
<EditText
android:id="@+id/EditText_contact_search"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:drawableLeft="@android:drawable/ic_menu_search"
android:hint="Search"
android:textColor="@android:color/white"
android:typeface="serif"
android:textSize="20sp"
android:focusableInTouchMode="true"
android:background="@android:color/transparent" >
</EditText>
<ListView
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:id="@+id/lv"
android:background="@android:color/transparent"
/>
</LinearLayout>
</FrameLayout>
我将FrameLayout 用于我的其他作品。
如果有其他想法,请建议我。
【问题讨论】:
-
您有一个用于两个字符串数组(names[] 和phones[])的arrayadapter,并且您只对第一个进行排序。您最好只使用一个字符串数组 (names_phones[])。用一些特殊字符(如 ===)分隔姓名和电话号码。然后排序。在 getView 中拆分名称和电话中的字符串。