【问题标题】:filtering listview results after selecting spinner value选择微调器值后过滤列表视图结果
【发布时间】:2017-03-08 06:39:22
【问题描述】:

我的项目中有 3 个spinners,分别命名为标准、部门和年龄。它们包含来自 json 数据的值。当我从每个人 spinner 中选择一个值时,它会分别显示 listview 中的所有学生数据(从 json 获取)。

我正在使用以下 JSON 数据:

[
{
"name":"aarti",
"surname":"singh",
"age":"18",
"div":"A",
"standard":"7"
},
{
"name":"seema",
"surname":"desai",
"age":"17",
"div":"B",
"standard":"7"
},
{
"name":"tina",
"surname":"joshi",
"age":"18",
"div":"A",
"standard":"8"
},
{
"name":"megha",
"surname":"kale",
"age":"17",
"div":"A",
"standard":"7"
},
{
"name":"swati",
"surname":"marathe",
"age":"18",
"div":"A",
"standard":"8"
},
{
"name":"rekha",
"surname":"surve",
"age":"17",
"div":"A",
"standard":"7"
},
{
"name":"madhu",
"surname":"dalvi",
"age":"18",
"div":"B",
"standard":"6"
}

我正在尝试这样做: 当我从微调器中选择标准 7 时,它应该显示学生学习第 7 标准的信息(“aarti”、“seema”、“megha”、“rekha”)以及他们的其他信息。 然后我从分区微调器中选择值说“A”,它应该接受上述结果,并相应地显示来自标准 7 和分区“A”的学生。它应该将结果显示为 ("aarti"、"megha"、"rekha") 以及它们的其他信息。 最后,当我从年龄微调器中选择值时说“17”,它应该接受上述结果,并相应地显示来自标准 7 和“A”和“17”的学生。因此,它显示“megha”和“rekha”。

谁能帮帮我

这是我的 MainActivity.java 类:

public class MainActivity extends AppCompatActivity {

ArrayList<String> AllStandards = new ArrayList<>();
ArrayList<String> AllDivision = new ArrayList<>();
ArrayList<String> AllAge = new ArrayList<>();
JSONArray jsonArray;
Spinner spinner_std, spinner_div, spinner_age;
private ArrayList<StudInfo> studentVOList = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

final List<String> item_Std = getStandard("data.json");
final List<String> items_div = getDivision("data.json");
final List<String> items_age = getAge("data.json");

/*spinner for standard*/
spinner_std = (Spinner) findViewById(R.id.spinnerStandard);
ArrayAdapter<String> adapter_std = new ArrayAdapter<String>(this,     R.layout.spinner_standard_layout, R.id.textViewStandard, item_Std);

adapter_std.getFilter().filter(txt);

spinner_std.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
    try {

        String standard = AllStandards.get(i);

        if (studentVOList.size() > 0)
            studentVOList.clear();
        for (int j = 0; j < jsonArray.length(); j++) {
            JSONObject jsonObject = jsonArray.getJSONObject(j);
            String stand = jsonObject.getString("standard");
            if (stand.equalsIgnoreCase(standard)) {
                StudInfo studentVO = new StudInfo();

                studentVO.setName(jsonObject.getString("name"));
                studentVO.setSurname(jsonObject.getString("surname"));
                studentVO.setAge(jsonObject.getString("age"));
                studentVO.setDiv(jsonObject.getString("div"));
                studentVO.setStandard(jsonObject.getString("standard"));

                studentVO.setStandard(stand);
                studentVOList.add(studentVO);
            }
        }
        // Log.d("TAG", "List With All Students in selected standard: " + studentVOList.size());

        Intent intent = new Intent(getApplicationContext(), StudentsInfo.class);
        Bundle b = new Bundle();
        b.putSerializable("list", studentVOList);
        intent.putExtra("bundle", b);
        startActivity(intent);
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

public void onNothingSelected(AdapterView<?> arg0) {
}
});
spinner_std.setAdapter(adapter_std);

/*spinner for division*/
spinner_div = (Spinner) findViewById(R.id.spinnerDiv);
ArrayAdapter<String> adapter_div = new ArrayAdapter<String>(this,  R.layout.spinner_division_layout, R.id.textViewDivision, items_div);
adapter_div.getFilter().filter(txt);

spinner_div.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
    try {

        String division = AllDivision.get(i);

        if (studentVOList.size() > 0)
            studentVOList.clear();
        for (int j = 0; j < jsonArray.length(); j++) {
            JSONObject jsonObject = jsonArray.getJSONObject(j);
            String div = jsonObject.getString("div");
            // Collections.sort(AllDivision);

            if (div.equalsIgnoreCase(division)) {
                StudInfo studentVO = new StudInfo();

                studentVO.setName(jsonObject.getString("name"));
                studentVO.setSurname(jsonObject.getString("surname"));
                studentVO.setAge(jsonObject.getString("age"));
                studentVO.setStandard(jsonObject.getString("standard"));
                studentVO.setDiv(jsonObject.getString("div"));

                studentVO.setDiv(div);
                studentVOList.add(studentVO);
            }
        }
        Intent intent = new Intent(getApplicationContext(), StudentsInfo.class);
        Bundle b = new Bundle();
        b.putSerializable("list", studentVOList);
        intent.putExtra("bundle", b);

        startActivity(intent);
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

public void onNothingSelected(AdapterView<?> arg0) {
}
});
spinner_div.setAdapter(adapter_div);

/*spinner for age*/
spinner_age = (Spinner) findViewById(R.id.spinerAge);
ArrayAdapter<String> adapter_age = new ArrayAdapter<String>(this,  R.layout.spinner_age_layout, R.id.textViewAge, items_age);
adapter_age.getFilter().filter(txt);

spinner_age.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
    try {

        String age = AllAge.get(i);

        if (studentVOList.size() > 0)
            studentVOList.clear();
        for (int j = 0; j < jsonArray.length(); j++) {
            JSONObject jsonObject = jsonArray.getJSONObject(j);
            String age_list = jsonObject.getString("age");
            Collections.sort(AllAge);

            if (age_list.equalsIgnoreCase(age)) {
                StudInfo studentVO = new StudInfo();

                studentVO.setName(jsonObject.getString("name"));
                studentVO.setSurname(jsonObject.getString("surname"));
                studentVO.setDiv(jsonObject.getString("div"));
                studentVO.setStandard(jsonObject.getString("standard"));
                studentVO.setAge(jsonObject.getString("age"));

                studentVO.setAge(age_list);
                studentVOList.add(studentVO);
            }
        }
        Intent intent = new Intent(getApplicationContext(),  StudentsInfo.class);
        Bundle b = new Bundle();
        b.putSerializable("list", studentVOList);
        intent.putExtra("bundle", b);

        startActivity(intent);
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

public void onNothingSelected(AdapterView<?> arg0) {
}
});
spinner_age.setAdapter(adapter_age);

}//onCreate Method

private List<String> getStandard(String fileName) {
jsonArray = null;
try {
InputStream is = getResources().getAssets().open(fileName);
int size = is.available();
byte[] data = new byte[size];
is.read(data);
is.close();
String json = new String(data, "UTF-8");

// AllStandards.clear();
try {
    jsonArray = new JSONArray(json);

    for (int i = 0; i < jsonArray.length(); i++) {
        JSONObject jsonObject = jsonArray.getJSONObject(i);
        String stand = jsonObject.getString("standard");

        if (!AllStandards.contains(stand)) {
            AllStandards.add(stand);
        }
    }
} catch (JSONException je) {
    je.printStackTrace();
} catch (Exception e) {
    e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
return AllStandards;
}

private List<String> getDivision(String fileName) {
jsonArray = null;
try {
InputStream is = getResources().getAssets().open(fileName);
int size = is.available();
byte[] data = new byte[size];
is.read(data);
is.close();
String json = new String(data, "UTF-8");
try {
    jsonArray = new JSONArray(json);

    for (int i = 0; i < jsonArray.length(); i++) {
        JSONObject jsonObject = jsonArray.getJSONObject(i);
        String stand = jsonObject.getString("div");
        if (!AllDivision.contains(stand)) {
            AllDivision.add(stand);
        }
    }
} catch (JSONException je) {
    je.printStackTrace();
} catch (Exception e) {
    e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
return AllDivision;
}

private List<String> getAge(String fileName) {
jsonArray = null;
try {
InputStream is = getResources().getAssets().open(fileName);
int size = is.available();
byte[] data = new byte[size];
is.read(data);
is.close();
String json = new String(data, "UTF-8");
try {
    jsonArray = new JSONArray(json);

    for (int i = 0; i < jsonArray.length(); i++) {
        JSONObject jsonObject = jsonArray.getJSONObject(i);
        String stand = jsonObject.getString("age");
        if (!AllAge.contains(stand)) {
            AllAge.add(stand);
        }
    }
} catch (JSONException je) {
    je.printStackTrace();
} catch (Exception e) {
    e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
return AllAge;
}

这是我的 ListAdapter.java 类

public class ListAdapter extends ArrayAdapter<StudInfo> {
int vg;
ArrayList<StudInfo> list;
Context context;

public ListAdapter(Context context, int vg, int id, ArrayList<StudInfo> list) {
super(context, vg, id, list);
this.context = context;
this.vg = vg;
this.list = list;
}

public View getView(int position, View convertView, ViewGroup parent) {

LayoutInflater inflater = (LayoutInflater)     context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

View itemView = inflater.inflate(vg, parent, false);

TextView textViewName = (TextView) itemView.findViewById(R.id.txtName);
TextView textViewSurname = (TextView)itemView.findViewById(R.id.txtSurname);
TextView textViewAge = (TextView) itemView.findViewById(R.id.txtAge);
TextView textViewDiv = (TextView) itemView.findViewById(R.id.txtDiv);
TextView textViewStd = (TextView) itemView.findViewById(R.id.txtStandard);

textViewName.setText(list.get(position).getName());
textViewSurname.setText(list.get(position).getSurname());
textViewAge.setText(list.get(position).getAge());
textViewDiv.setText(list.get(position).getDiv());
textViewStd.setText(list.get(position).getStandard());

return itemView;
}
}

这是我的 StudentInfo.java 类

public class StudentsInfo extends Activity {

ListView listView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
 setContentView(R.layout.studentsinfo_layout);

Bundle b = getIntent().getBundleExtra("bundle");

ArrayList<StudInfo> studentVOList = (ArrayList<StudInfo>) b.getSerializable("list");

ListView listView = (ListView) findViewById(R.id.listViewShow);
ListAdapter listAdapter = new ListAdapter(this, R.layout.list_layout,    R.id.txtName, studentVOList);
listView.setAdapter(listAdapter);
}
}

这是我的 StudInfo.java 类,

import java.io.Serializable;

public class StudInfo implements Serializable
{
private String name;
private String surname;
private String age;
private String div;
private String standard;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getSurname() {
    return surname;
}

public void setSurname(String surname) {
    this.surname = surname;
}

public String getAge() {
    return age;
}

public void setAge(String age) {
    this.age = age;
}

public String getDiv() {
    return div;
}

public void setDiv(String div) {
    this.div = div;
}

public String getStandard() {
    return standard;
}

public void setStandard(String standard) {
    this.standard = standard;
}
}

我尝试用谷歌搜索找到解决方案,但我发现的问题都是基于使用 edittext 搜索 listview 项目。我没有找到与我的问题匹配的类似帖子来解决我的问题。谁能帮我解决这个问题??

【问题讨论】:

    标签: java android json listview


    【解决方案1】:

    1.覆盖适配器类中的 getFilter 方法

    2。在您的微调器选择中使用 adapter.getFilter().filter(txt)

     package com.hughesnet.adapters;
    
     import com.hughesnet.R;
    
     import android.content.Context;
     import android.view.LayoutInflater;
     import android.view.View;
     import android.view.ViewGroup;
     import android.widget.Filter;
     import android.widget.TextView;
    
     import java.util.ArrayList;
    
     public class ListAdapter extends ArrayAdapter<StudInfo> {
    int                 vg;
    ArrayList<StudInfo> list;
    Context             context;
    ItemFilter mFilter;
    ArrayList<StudInfo> filteredData;
    
    public ListAdapter (Context context, int vg, int id, ArrayList<StudInfo> list) {
    
        super (context, vg, id, list);
        this.context = context;
        this.vg = vg;
        this.list = list;
    }
    
    public View getView (int position, View convertView, ViewGroup parent) {
    
        LayoutInflater inflater = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE);
    
        View itemView = inflater.inflate (vg, parent, false);
    
        TextView textViewName = (TextView) itemView.findViewById (R.id.txtName);
        TextView textViewSurname = (TextView) itemView.findViewById (R.id.txtSurname);
        TextView textViewAge = (TextView) itemView.findViewById (R.id.txtAge);
        TextView textViewDiv = (TextView) itemView.findViewById (R.id.txtDiv);
        TextView textViewStd = (TextView) itemView.findViewById (R.id.txtStandard);
    
        textViewName.setText (list.get (position).getName ());
        textViewSurname.setText (list.get (position).getSurname ());
        textViewAge.setText (list.get (position).getAge ());
        textViewDiv.setText (list.get (position).getDiv ());
        textViewStd.setText (list.get (position).getStandard ());
    
        return itemView;
    }
    
    ItemFilter mFilter = new ItemFilter ();
    
    public Filter getFilter () {
    
        return mFilter;
    }
    
    private class ItemFilter extends Filter {
        @Override
        protected FilterResults performFiltering (CharSequence constraint) {
    
            String filterString = constraint.toString ().toLowerCase ();
    
            FilterResults results = new FilterResults ();
    
            int count = list.size ();
            final ArrayList<StudInfo> nlist = new ArrayList<StudInfo> (count);
    
            String filterableString;
    
            for (int i = 0; i < count; i++) {
                StudInfo info = list.get (i);
                // Check for standard, division and age here
                if (info.getAge().contains(filterString) || info.getStandard().contains(filterString ) || info.getDiv().contains(filterString )) {
                    nlist.add (filterableString);
                }
            }
    
            results.values = nlist;
            results.count = nlist.size ();
    
            return results;
        }
    
        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            filteredData = (ArrayList<StudInfo>) results.values;
            notifyDataSetChanged();
        }
    }
    

    }

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 2013-06-29
    • 1970-01-01
    相关资源
    最近更新 更多