使用按钮过滤自定义列表视图(Android)
我有一个使用按钮过滤自定义列表视图(Android),android,listview,filter,android-adapter,Android,Listview,Filter,Android Adapter,我有一个片段包含一个带有自定义适配器的自定义列表视图。我在这个列表中显示的是一些医生,他们的属性是:图片,姓名,年龄和性别 我想做的是按下按钮时按性别过滤医生。因此,默认设置将显示所有医生,男性按钮将显示所有男性,女性按钮将显示所有女性。(如下图所示) 这是我的片段代码: public class Doctors extends Fragment { String[] names = {"Richard Johnson", "William Perez", "Jennifer Field
片段
包含一个带有自定义适配器的自定义列表视图
。我在这个列表中显示的是一些医生,他们的属性是:图片
,姓名
,年龄
和性别
我想做的是按下按钮时按性别过滤医生。因此,默认设置将显示所有医生,男性按钮将显示所有男性,女性按钮将显示所有女性。(如下图所示)
这是我的片段代码:
public class Doctors extends Fragment {
String[] names = {"Richard Johnson", "William Perez", "Jennifer Fields", "Caroline Marin", "John Smith"};
String[] ages = {"25", "32", "41", "31", "29"};
String[] gender = {"Male", "Male", "Female", "Female", "Male"};
int[] images = { R.drawable.delete_doctora,R.drawable.delete_doctora,R.drawable.delete_doctora,R.drawable.delete_doctora,R.drawable.delete_doctora,};
ListView list;
ArrayAdapter<DocItem> adapter;
ArrayList<DocItem> arrayList;
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState){
View view = inflater.inflate(R.layout.activity_doctors, container, false);
arrayList = new ArrayList<DocItem>();
for(int i = 0; i < 5; i++){
arrayList.add(i,new DocItem(names[i], ages[i], gender[i], images[i]));
}
adapter = new DocAdapter(getActivity(), arrayList);
list = (ListView) view.findViewById(R.id.ListDocs);
list.setAdapter(adapter);
list.setTextFilterEnabled(true);
return view;
}
}
在适配器中使用两个阵列。一个用于存储,一个用于当前显示的项目
private ArrayList<DocItem> all_values; //All items
private ArrayList<DocItem> filter_values; //Shown items
public DocAdapter(Context context, ArrayList<DocItem> values) {
...
all_values = new ArrayList<DocItem>();
all_values.addAll(values);
filter_values = all_values.clone();
}
...
@Override
public int getCount() {
return filter_values.size();
}
public void noFilter() {
filter_values = all_values;
notifyDataSetChanged();
}
public void filterMales() {
filterGender("Male");
}
public void filterFemales() {
filterGender("Female");
}
private void filterGender(String gender) {
filter_values = new ArrayList<>();
for(DocItem doc : all_values) {
if(doc._gender.equals(gender)) {
filter_values.add(doc);
}
}
notifyDataSetChanged();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
!!! USE filter_values array
}
在适配器中使用两个阵列。一个用于存储,一个用于当前显示的项目
private ArrayList<DocItem> all_values; //All items
private ArrayList<DocItem> filter_values; //Shown items
public DocAdapter(Context context, ArrayList<DocItem> values) {
...
all_values = new ArrayList<DocItem>();
all_values.addAll(values);
filter_values = all_values.clone();
}
...
@Override
public int getCount() {
return filter_values.size();
}
public void noFilter() {
filter_values = all_values;
notifyDataSetChanged();
}
public void filterMales() {
filterGender("Male");
}
public void filterFemales() {
filterGender("Female");
}
private void filterGender(String gender) {
filter_values = new ArrayList<>();
for(DocItem doc : all_values) {
if(doc._gender.equals(gender)) {
filter_values.add(doc);
}
}
notifyDataSetChanged();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
!!! USE filter_values array
}
你的问题是什么?当按下相应按钮时,如何仅显示ListView中的男性或女性。使用'gender'值作为过滤器使用“ready for custom filters”数组适配器您的问题是什么?当按下相应按钮时,如何仅显示ListView中的男性或女性。使用“性别”值作为过滤器使用“准备好自定义过滤器”数组适配器不是最理想的解决方案,但它应该能够完成任务。如何从我的医生类按钮访问filterMales方法?@CarlosCampos添加了用法示例。您还需要对“All”按钮执行相同的操作。我尝试过,但收到一个错误提示:无法解析方法“filterMales”:(是的,我看到了你的问题。在你的片段中使用DocAdapter
而不是ArrayAdapter
。这不是最理想的解决方案,但应该可以完成任务。如何从我的医生类按钮访问filterMales方法?@CarlosCampos添加了用法示例。你还需要对“所有”使用相同的方法。)按钮。我尝试了,但收到一个错误,告诉我:无法解决方法“filterMales”:(是的,我看到了您的问题。在片段中使用DocAdapter
,而不是ArrayAdapter
。
private ArrayList<DocItem> all_values; //All items
private ArrayList<DocItem> filter_values; //Shown items
public DocAdapter(Context context, ArrayList<DocItem> values) {
...
all_values = new ArrayList<DocItem>();
all_values.addAll(values);
filter_values = all_values.clone();
}
...
@Override
public int getCount() {
return filter_values.size();
}
public void noFilter() {
filter_values = all_values;
notifyDataSetChanged();
}
public void filterMales() {
filterGender("Male");
}
public void filterFemales() {
filterGender("Female");
}
private void filterGender(String gender) {
filter_values = new ArrayList<>();
for(DocItem doc : all_values) {
if(doc._gender.equals(gender)) {
filter_values.add(doc);
}
}
notifyDataSetChanged();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
!!! USE filter_values array
}
Button buttonMales = (Button) findViewById(R.id.filterMales);
Button buttonFemales = (Button) findViewById(R.id.filterFemales);
buttonMales.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
adapter.filterMales();
}
});
buttonFemales.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
adapter.filterFemales();
}
});