繁体   English   中英

SearchView显示错误的ListView项目

[英]SearchView displaying wrong ListView items

我的应用程序中的SearchView显示不正确的ListView项目时遇到问题。

如果我键入名称: ListView显示按预期方式

如果我键入Name1:我会收到1-2条

如果我输入名称2-11:我得到名称1的条目


这是一个视觉效果: 视觉


据我所知,代码很好,但是应用程序未按预期工作。 有人可以指出正确的方向来解决这个问题吗?


将显示ListView和来自以下数据的自定义阵列适配器:

[{"society_id":1,"name":"Name1","email":"Test@email1","description":"TestDes1"},
{"society_id":2,"name":"Name2","email":"Test@email2","description":"TestDes2"},
{"society_id":3,"name":"Name3","email":"Test@email3","description":"TestDes3"},...]

SocietySearch.java:

public class SocietySearch extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) { //TODO remember notifyDataSetChanged
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_society_search);

        List<Society> societies = new ArrayList<>();
        ServerRequests serverRequest1 = new ServerRequests(SocietySearch.this);
        serverRequest1.GetSocietyDataAsyncTask(societies, new GetSocietyCallback() {

            @Override
            public void done(final List<Society> societies) {
                ListView lv = (ListView) findViewById(R.id.ListView);
                List<ListViewItem> items = new ArrayList<>();
                for (final Society s : societies) {
                    items.add(new ListViewItem() {{
                        ThumbnailResource = R.drawable.test;
                        Title = s.socName;
                        Description = s.socDes;
                    }});
                }
                final CustomListViewAdapter adapter = new CustomListViewAdapter(SocietySearch.this, items, societies);
                lv.setAdapter(adapter);

                SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
                SearchView searchView = (SearchView) findViewById(R.id.search);
                searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
                searchView.setQueryHint("Search..");

                searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                    @Override
                    public boolean onQueryTextSubmit(String query) {
                        return false;
                    }

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

    public class ListViewItem {
        public int ThumbnailResource;
        public String Title;
        public String Description;
    }

CustomListViewAdapter.java:

public class CustomListViewAdapter extends ArrayAdapter {

    LayoutInflater inflater;
    List<SocietySearch.ListViewItem> items;

    public CustomListViewAdapter(Activity context, List<SocietySearch.ListViewItem> items, List<Society> societies) {

        super(context, R.layout.item_row, societies);

        this.items = items;
        this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        //Auto-generated method stub

        ListViewItem item = items.get(position);

        View vi = convertView;

        if (convertView == null)
            vi = inflater.inflate(R.layout.item_row, null);

        ImageView test = (ImageView) vi.findViewById(R.id.imgThumbnail);
        TextView txtTitle = (TextView) vi.findViewById(R.id.txtTitle);
        TextView txtSubTitle = (TextView) vi.findViewById(R.id.txtSubTitle);

        test.setImageResource(item.ThumbnailResource);
        txtTitle.setText(item.Title);
        txtSubTitle.setText(item.Description);


        return vi;
    }
}

Society.java:

public class Society {

    String socName, socEmail, socDes;
    int society_id;

    public Society(int society_id, String socName, String socEmail, String socDes) {

        this.society_id = society_id;
        this.socName = socName;
        this.socEmail = socEmail;
        this.socDes = socDes;

    }

    public String toString() {
        return socName;
    }
}

AndroidManifest.xml中:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="k.unionapp">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".HomeScreenActivity"
            android:theme="@style/AppTheme.NoActionBar"></activity>
        <activity android:name=".SocietySearch"></activity>
    </application>
</manifest>

我相信您的问题可能是因为您保留了内存中的原始列表,并且将视图绑定到该列表上

ListViewItem item = items.get(position);

相反,您可能要尝试从适配器本身获取项目,因为基础列表已由Filter更改。

ListViewItem item = this.getItem(position);

您需要在SocietySearch.ListViewItem类中提供toString方法的实现,该方法将返回项的名称。

public class ListViewItem {
    public int ThumbnailResource;
    public String Title;
    public String Description;

    @Override
    public String toString(){
        return Title;
    }
}

ArrayAdapter中filter的默认实现使用此方法将任意项目类型转换为String然后将其与搜索查询进行比较。 同样,默认实现ArrayFilter使用查询字符串作为前缀FYI。


另外,如其他答案中所述-不要在构造函数和getView方法中保留原始列表。 使用数组适配器本身的getItem方法。

您可能还想更改类声明以包括自定义类型的项,而不是通用Object

public class CustomListViewAdapter extends ArrayAdapter<SocietySearch.ListViewItem> {

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM