有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在搜索期间更新listview

这是我启动时的应用程序:

当我在列表视图中单击某个项目时,它将打开一个新活动并显示一些数据

当我搜索某物时,它看起来如下:

当我点击列表中的一个项目时,它会启动一个新的活动。但它开始的活动并不准确

这是我的密码:

家庭活动。班级

package com.thesis.herbalmedicines.activity;

import java.util.ArrayList;
import java.util.Arrays;

import 安卓.app.Activity;
import 安卓.content.Intent;
import 安卓.content.res.TypedArray;
import 安卓.graphics.Color;
import 安卓.graphics.drawable.ColorDrawable;
import 安卓.os.Bundle;
import 安卓.view.View;
import 安卓.widget.AdapterView;
import 安卓.widget.ListView;
import 安卓.widget.SearchView;
import 安卓.widget.TextView;
import 安卓.widget.Toast;

public class HomeActivity extends BaseActivity implements
        SearchView.OnQueryTextListener {

    ListView lv;
    SearchView search;

    String[] herb_names, sample_arr; //= ["Boils","",""];//, iso_codes;
    TypedArray herb_pics;

    ArrayList<Home> homelist;
    HomeAdapter adapter;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getLayoutInflater().inflate(R.layout.home_layout, frameLayout);

        mDrawerList.setItemChecked(position, true);
        setTitle(listArray[position]);

        安卓.app.ActionBar ab = getActionBar(); 
        ColorDrawable colorDrawable = new ColorDrawable(Color.parseColor("#50B222"));     
        ab.setBackgroundDrawable(colorDrawable);


        lv = (ListView) findViewById(R.id.list_view);
        search = (SearchView) findViewById(R.id.search_view);

        herb_names = getResources().getStringArray(R.array.herb_names);
        //iso_codes = getResources().getStringArray(R.array.iso_Code);
        herb_pics = getResources().obtainTypedArray(R.array.herb_pics);

        homelist = new ArrayList<Home>();
        for (int i = 0; i < herb_names.length; i++) {
            Home home = new Home(herb_names[i], //iso_codes[i],
                    herb_pics.getResourceId(i, -1));
            homelist.add(home);
        }

        adapter = new HomeAdapter(getApplicationContext(), homelist);
        lv.setAdapter(adapter);

        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {

                if (position == 0) {
                    Intent a = new Intent(HomeActivity.this, Boils.class);
                    startActivity(a);

                    /** Fading Transition Effect */
                    HomeActivity.this.overridePendingTransition(安卓.R.anim.fade_in, 安卓.R.anim.fade_out);
                }

                else if (position == 1) {
                    Intent b = new Intent(HomeActivity.this, Cystitis.class);
                    startActivity(b);

                    /** Fading Transition Effect */
                    HomeActivity.this.overridePendingTransition(安卓.R.anim.fade_in, 安卓.R.anim.fade_out);
                }

                else if (position == 2) {
                    Intent c = new Intent(HomeActivity.this, Asthma.class);
                    startActivity(c);

                    /** Fading Transition Effect */
                    HomeActivity.this.overridePendingTransition(安卓.R.anim.fade_in, 安卓.R.anim.fade_out);
                }
                else if (position == 3) {
                    Intent d = new Intent(HomeActivity.this, Feet.class);
                    startActivity(d);

                    /** Fading Transition Effect */
                    HomeActivity.this.overridePendingTransition(安卓.R.anim.fade_in, 安卓.R.anim.fade_out);
                }



            }
        });
        search.setOnQueryTextListener(this);
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        adapter.getFilter().filter(newText);
        return false;
    }

    @Override
    public boolean onQueryTextSubmit(String query) {
        return false;
    }



}

回家。java

package com.thesis.herbalmedicines.activity;

public class Home {

    String name;
    int pics;
    Home(String name, int pics) {
        this.name = name;
        this.pics = pics;
    }

    public String getName() {
        return name;
    }

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

    public int getPics() {
        return pics;
    }

    public void setPics(int pics) {
        this.pics = pics;
    }

}

家庭适配器。java

package com.thesis.herbalmedicines.activity;

import java.util.ArrayList;

import 安卓.app.Activity;
import 安卓.content.Context;
import 安卓.view.LayoutInflater;
import 安卓.view.View;
import 安卓.view.ViewGroup;
import 安卓.widget.BaseAdapter;
import 安卓.widget.Filter;
import 安卓.widget.Filterable;
import 安卓.widget.ImageView;
import 安卓.widget.TextView;

public class HomeAdapter extends BaseAdapter implements Filterable {

    Context context;
    ArrayList<Home> homelist;
    ArrayList<Home> mStringFilterList;
    ValueFilter valueFilter;

    HomeAdapter(Context context, ArrayList<Home> homelist) {
        this.context = context;
        this.homelist = homelist;
        mStringFilterList = homelist;
    }

    @Override
    public int getCount() {
        return homelist.size();
    }

    @Override
    public Object getItem(int position) {
        return homelist.get(position);
    }

    @Override
    public long getItemId(int position) {
        return homelist.indexOf(getItem(position));
    }

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

        LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

        convertView = null;
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_item, null);

            TextView name_tv = (TextView) convertView.findViewById(R.id.name);
            ImageView iv = (ImageView) convertView.findViewById(R.id.pic);

            Home home = homelist.get(position);

            name_tv.setText(home.getName());
            iv.setImageResource(home.getPics());
        }
        return convertView;
    }

    @Override
    public Filter getFilter() {
        if (valueFilter == null) {
            valueFilter = new ValueFilter();
        }
        return valueFilter;
    }

    private class ValueFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();

            if (constraint != null && constraint.length() > 0) {
                ArrayList<Home> filterList = new ArrayList<Home>();
                for (int i = 0; i < mStringFilterList.size(); i++) {
                    if ((mStringFilterList.get(i).getName().toUpperCase())
                            .contains(constraint.toString().toUpperCase())) {

                        Home home = new Home(mStringFilterList.get(i)
                                .getName(), mStringFilterList.get(i)
                                .getPics());

                        filterList.add(home);
                    }
                }
                results.count = filterList.size();
                results.values = filterList;
            } else {
                results.count = mStringFilterList.size();
                results.values = mStringFilterList;
            }
            return results;

        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results) {
            homelist = (ArrayList<Home>) results.values;
            notifyDataSetChanged();
        }

    }

}

共 (3) 个答案

  1. # 1 楼答案

    在每个onSerch上将adpter设置为listview

  2. # 2 楼答案

    添加一个字段,该字段保存要在Home类中加载的类。(id字段是可选的)

    public class Home {
        int id;
        String name;
        int pics;
        Class clazz;
    
        Home(int id, String name, int pics, Class clazz) {
            this.id = id;
            this.name = name;
            this.pics = pics;
            this.clazz = clazz;
        }
        // getters and setters
    }
    

    在初始化homelist的过程中,添加id

    // the classed to load
    Class[] classes = {
        Boils.class,
        Cystitis.class,
        Asthma.class,
        Feet.class
    };
    
    for (int i = 0; i < herb_names.length; i++) {
        Home home = new Home(i, herb_names[i], herb_pics.getResourceId(i, -1), classes[i]);
        homelist.add(home);
    }
    

    setOnItemClickListener

    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,  int position, long id) {
    
            Home item = (Home) adapter.getItem(position);
    
            Intent d = new Intent(HomeActivity.this, item.getClazz());
            startActivity(d);
    
            /** Fading Transition Effect */
            HomeActivity.this.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
        }
    });
    

    您的适配器也应该做一些更改

    getView内,您正在强制convertView为null。这对性能不利。(考虑也使用ViewHolder

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    
        LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_item, null);
        }
    
        TextView name_tv = (TextView) convertView.findViewById(R.id.name);
        ImageView iv = (ImageView) convertView.findViewById(R.id.pic);
    
        Home home = homelist.get(position);
    
        name_tv.setText(home.getName());
        iv.setImageResource(home.getPics());
    
        return convertView;
    }
    

    publishResults内,您正在为数据集创建一个新引用。您应该更新现有的数据集

    @Override
    protected void publishResults(CharSequence constraint,  FilterResults results) {
        homelist.clear();
        homelist.addAll((ArrayList<Home>) results.values);
        notifyDataSetChanged();
    }
    
  3. # 3 楼答案

    为什么要使用位置导航到不同的活动

        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
    
                if (position == 0) {
                    Intent a = new Intent(HomeActivity.this, Boils.class);
                    startActivity(a);
    
                    /** Fading Transition Effect */
                    HomeActivity.this.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
                }
    
                else if (position == 1) {
                    Intent b = new Intent(HomeActivity.this, Cystitis.class);
                    startActivity(b);
    
                    /** Fading Transition Effect */
                    HomeActivity.this.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
                }
    
                else if (position == 2) {
                    Intent c = new Intent(HomeActivity.this, Asthma.class);
                    startActivity(c);
    
                    /** Fading Transition Effect */
                    HomeActivity.this.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
                }
                else if (position == 3) {
                    Intent d = new Intent(HomeActivity.this, Feet.class);
                    startActivity(d);
    
                    /** Fading Transition Effect */
                    HomeActivity.this.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
                }
    
    
    
            }
        });
        search.setOnQueryTextListener(this);
    }
    

    每当您从搜索结果刷新适配器时,这将始终重置您的位置

    以更好的方式做到这一点。只需在适配器中创建如下自定义侦听器

    Public interface ListViewClick{
      void onListClick(Object type)
    }
    

    在活动中注册接收器,并传递要从适配器启动的活动类型

      private ListViewClick callback;
      HomeAdapter(Context context, ArrayList<Home> homelist,ListViewClick callback) {
            this.context = context;
            this.homelist = homelist;
            mStringFilterList = homelist;
            this.callback = callback;
        }
    

    然后单击convertView的侦听器传递callback.onListClick(//type of activity to launch)

    只需保留“在家开展的活动类型”的参考。因此,当单击列表视图的特定行时,您可以识别要启动的活动