Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用按钮过滤自定义列表视图(Android)_Android_Listview_Filter_Android Adapter - Fatal编程技术网

使用按钮过滤自定义列表视图(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();
    }
});