【问题标题】:In android how to use search view in list view to suggest some sort of names?在android中如何使用列表视图中的搜索视图来建议某种名称?
【发布时间】:2014-07-23 04:09:52
【问题描述】:

在android中如何在listview中使用searchview?
Listview 包含 imageview 和多个 textviews
当我过去在搜索中键入一些文本时,列表视图要根据我的搜索显示
如何执行此操作
在此先感谢

【问题讨论】:

标签: android listview search


【解决方案1】:

像这样创建一个自定义适配器

public class PlanetAdapter extends ArrayAdapter<Planet> implements Filterable {

    private List<Planet> planetList;
    private Context context;
    private Filter planetFilter;
    private List<Planet> origPlanetList;

    public PlanetAdapter(List<Planet> planetList, Context ctx) {
        super(ctx, R.layout.img_row_layout, planetList);
        this.planetList = planetList;
        this.context = ctx;
        this.origPlanetList = planetList;
    }

    public int getCount() {
        return planetList.size();
    }

    public Planet getItem(int position) {
        return planetList.get(position);
    }

    public long getItemId(int position) {
        return planetList.get(position).hashCode();
    }

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

        PlanetHolder holder = new PlanetHolder();

        // First let's verify the convertView is not null
        if (convertView == null) {
            // This a new view we inflate the new layout
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.img_row_layout, null);
            // Now we can fill the layout with the right values
            TextView tv = (TextView) v.findViewById(R.id.name);
            TextView distView = (TextView) v.findViewById(R.id.dist);


            holder.planetNameView = tv;
            holder.distView = distView;

            v.setTag(holder);
        }
        else 
            holder = (PlanetHolder) v.getTag();

        Planet p = planetList.get(position);
        holder.planetNameView.setText(p.getName());
        holder.distView.setText("" + p.getDistance());


        return v;
    }

    public void resetData() {
        planetList = origPlanetList;
    }


    /* *********************************
     * We use the holder pattern        
     * It makes the view faster and avoid finding the component
     * **********************************/

    private static class PlanetHolder {
        public TextView planetNameView;
        public TextView distView;
    }



    /*
     * We create our filter 
     */

    @Override
    public Filter getFilter() {
        if (planetFilter == null)
            planetFilter = new PlanetFilter();

        return planetFilter;
    }



    private class PlanetFilter extends Filter {



        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();
            // We implement here the filter logic
            if (constraint == null || constraint.length() == 0) {
                // No filter implemented we return all the list
                results.values = origPlanetList;
                results.count = origPlanetList.size();
            }
            else {
                // We perform filtering operation
                List<Planet> nPlanetList = new ArrayList<Planet>();

                for (Planet p : planetList) {
                    if (p.getName().toUpperCase().startsWith(constraint.toString().toUpperCase()))
                        nPlanetList.add(p);
                }

                results.values = nPlanetList;
                results.count = nPlanetList.size();

            }
            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results) {

            // Now we have to inform the adapter about the new list filtered
            if (results.count == 0)
                notifyDataSetInvalidated();
            else {
                planetList = (List<Planet>) results.values;
                notifyDataSetChanged();
            }

        }

    }
}

为行星创建 POJO(getter setter 类) 然后在你的活动中

//要显示的数据

List<Planet> planetsList = new ArrayList<Planet>();
    PlanetAdapter aAdpt;
 ListView lv = (ListView) findViewById(R.id.listView);
 aAdpt = new PlanetAdapter(planetsList, this);
        lv.setAdapter(aAdpt);

你可以像这样使用过滤

// TextFilter
          lv.setTextFilterEnabled(true);
          EditText editTxt = (EditText) findViewById(R.id.editTxt);          

          editTxt.addTextChangedListener(new TextWatcher() {

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    System.out.println("Text ["+s+"] - Start ["+start+"] - Before ["+before+"] - Count ["+count+"]");
                    if (count < before) {
                        // We're deleting char so we need to reset the adapter data
                        aAdpt.resetData();
                    }

                    aAdpt.getFilter().filter(s.toString());

                }

                @Override
                public void beforeTextChanged(CharSequence s, int start, int count,
                        int after) {

                }

                @Override
                public void afterTextChanged(Editable s) {
                }
            });
        }

【讨论】:

    【解决方案2】:

    iam 解决了这个问题,也使用 base adapter 你可以试试这个

    公共类 SubjectsActivity 扩展 Activity {

    private ImageView imgNavBarSubjectBook;
    private ArrayList<String> arrSubjectResponse;
    private ArrayList<String> arrChapterName;
    private ArrayList<String> arrFileUrl;
    private ArrayList<String> arrFileSize;
    private ListView listChapter;
    private TextView subjectName;
    
    private EditText edtSearch;
    private int textlength = 0;
    
    // Google Analytics starts from here
    private EasyTracker easyTracker = null;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_subjects);
    
        easyTracker = EasyTracker.getInstance(SubjectsActivity.this);
    
        subjectName = (TextView) findViewById(R.id.txtSubjectName);
        imgNavBarSubjectBook = (ImageView) findViewById(R.id.img_nav_bar_Subject_book);
    
        arrSubjectResponse = new ArrayList<String>();
        arrChapterName = new ArrayList<String>();
        arrFileUrl = new ArrayList<String>();
        arrFileSize = new ArrayList<String>();
    
        imgNavBarSubjectBook.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                finish();
    
            }
        });
    
        Typeface tf = Typeface.createFromAsset(getAssets(), "Georgia.ttf");
        subjectName.setTypeface(tf, Typeface.BOLD);
    
        Bundle bundle = getIntent().getExtras();
        if (bundle != null) {
            arrSubjectResponse = bundle
                    .getStringArrayList("arr_subject_response");
    
            for (int i = 1; i < arrSubjectResponse.size(); i = i + 8) {
                arrChapterName.add(arrSubjectResponse.get(i + 2));
                arrFileUrl.add(arrSubjectResponse.get(i + 6));
                arrFileSize.add(arrSubjectResponse.get(i + 5));
    
            }
        }
        listChapter = (ListView) findViewById(R.id.listChapter);
    
        subjectName.setText(CoursesAdapter.Subject_Name);
    
        listChapter.setAdapter(new SubjectAdapter(SubjectsActivity.this,
                arrChapterName, arrFileUrl, arrFileSize));
    
        edtSearch = (EditText) findViewById(R.id.edtSearchSubjects);
    
        edtSearch.addTextChangedListener(new TextWatcher() {
    
            @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {
                // TODO Auto-generated method stub
                textlength = edtSearch.getText().length();
                arrChapterName.clear();
                arrFileUrl.clear();
    
                for (int i = 1; i < arrSubjectResponse.size(); i = i + 8) {
    
                    String name = arrSubjectResponse.get(i + 2);
                    String searchtext = String.valueOf(s);// edtSearch.getText().toString();
                    if (textlength <= arrSubjectResponse.get(i + 2).length()) {
    
                        if (name.toLowerCase().indexOf
    
                        (searchtext.toLowerCase()) != -1) {
                            Log.d("",
                                    "------------Entered add value to list-----");
                            arrChapterName.add(arrSubjectResponse.get(i + 2));
                            arrFileUrl.add(arrSubjectResponse.get(i + 6));
                            arrFileSize.add(arrSubjectResponse.get(i + 5));
                        }
                    }
                }
    
                listChapter.setAdapter(new SubjectAdapter(
                        SubjectsActivity.this, arrChapterName, arrFileUrl,
                        arrFileSize));
                Log.d("", "Chapter------->" + arrChapterName);
                Log.d("", "Fileurl---------->" + arrFileUrl);
            }
    
            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1,
                    int arg2, int arg3) {
                // TODO Auto-generated method stub
    
            }
    
            @Override
            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub
    
            }
        });
    
    }
    
    @Override
    public void onStart() {
        super.onStart();
        EasyTracker.getInstance(this).activityStart(this);
    }
    
    @Override
    public void onStop() {
        super.onStop();
        EasyTracker.getInstance(this).activityStop(this);
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 2011-04-02
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多