Android 编程,ListView 图片在 SearchView 查询期间和查询后消失

Android Programming, ListView Images are gone during and after query in the SearchView

尝试在 SearchView 中查询 Search 后,我无法尝试使用其各自的图标重新显示 ListView 的原始值。 ListView 首先显示带有图标的项目,但在尝试搜索时消失。非常感谢您的帮助,谢谢。

MainActivity.java

package com.example.asus.sdssuanhandbookapplication;

import android.os.Bundle;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;


public class MainActivity extends AppCompatActivity {

    MySimpleAdapter adapter;
    ListView listView;
    String[] items;

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

        listView = (ListView) findViewById(R.id.list_view_article);
        items = getResources().getStringArray(R.array.article_list);

        adapter = new MySimpleAdapter(this, items);
        listView.setAdapter(adapter);

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

                String text = listView.getItemAtPosition(position).toString();
                Toast.makeText(MainActivity.this, "" + text, Toast.LENGTH_SHORT).show();

            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_search, menu);

        MenuItem searchItem = menu.findItem(R.id.item_search);
        SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

            @Override
            public boolean onQueryTextChange(String newText) {
                ArrayList<String> templist = new ArrayList<>();

                for (String temp : items) {
                    if (temp.toLowerCase().contains(newText.toLowerCase())) {
                        templist.add(temp);
                    }
                }
                ArrayAdapter<String> adapter = new ArrayAdapter<>(MainActivity.this,
                        android.R.layout.simple_list_item_1, templist);
                listView.setAdapter(adapter);



                return false;
            }

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

        return super.onCreateOptionsMenu(menu);
    }



}

MySimpleAdapter.java

package com.example.asus.sdssuanhandbookapplication;

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * Created by asus on 2/9/2017.
 */

public class MySimpleAdapter extends BaseAdapter {

    private final Activity context;
    private final String[] names;
    int[] imgs = {R.drawable.icn1,
            R.drawable.icn2,
            R.drawable.icn3,
            R.drawable.icn4,
            R.drawable.icn5,
            R.drawable.icn6,
            R.drawable.icn7,
            R.drawable.icn8,
            R.drawable.icn9,
            R.drawable.icn10,
            R.drawable.icn11,
            R.drawable.icn12,
            R.drawable.icn13,
            R.drawable.icn14,
            R.drawable.icn15,
            R.drawable.icn16,
            R.drawable.icn17,
            R.drawable.icn18,
            R.drawable.icn19,
            R.drawable.icn20,
            R.drawable.icn21,
            R.drawable.icn22
    };



    static class ViewHolder{
        public TextView text;
        public ImageView image;
    }

    public MySimpleAdapter(Activity context, String[] names) {
        this.context = context;
        this.names = names;
    }

    @Override
    public int getCount() {
        return names.length;
    }

    @Override
    public Object getItem(int position) {
        return names[position];
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

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

        View rowView = convertView;


        if (rowView == null){
            LayoutInflater inflater = context.getLayoutInflater();
            rowView = inflater.inflate(R.layout.row_layout, null);
            //Configure view holder
            ViewHolder viewHolder = new ViewHolder();
            viewHolder.text = (TextView) rowView.findViewById(R.id.articleTxt);
            viewHolder.image = (ImageView) rowView.findViewById(R.id.articleImage);
            rowView.setTag(viewHolder);

        }

        ViewHolder holder = (ViewHolder) rowView.getTag();
        String s = names[position];
        int icon = imgs[position];
        holder.text.setText(s);
        holder.text.setTextSize(13);
        holder.image.setImageResource(icon);

        return rowView;
    }
}

row_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="horizontal">


    <ImageView
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_margin="10dp"
        android:id="@+id/articleImage"
        android:src="@drawable/icn1"/>

    <TextView
        android:layout_marginTop="15dp"
        android:layout_marginRight="20dp"
        android:text="title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20dp"
        android:id="@+id/articleTxt"/>


</LinearLayout>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.asus.sdssuanhandbookapplication.MainActivity">

    <ListView
        android:id="@+id/list_view_article"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</RelativeLayout>

以下是应用程序实际截图:

Here is the Original ListView display on App first Open

Then when trying to query on Search, and displays the same after which Icons were gone

首先,当创建 listView 时,您正在使用 MySimpleAdapter,当搜索发生时,您正在调用不同的 ArrayAdapeter,图像的 id 在 MySimpleAdapter 的内部。您将无法使用这些图片

在 main

中像这样更改您的代码
import android.os.Bundle;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;


public class MainActivity extends AppCompatActivity {

    MySimpleAdapter adapter;
    ListView listView;
    String[] items;

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

        listView = (ListView) findViewById(R.id.list_view_article);
        items = getResources().getStringArray(R.array.article_list);

        adapter = new MySimpleAdapter(this, items, null);
        listView.setAdapter(adapter);

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

                String text = listView.getItemAtPosition(position).toString();
                Toast.makeText(MainActivity.this, "" + text, Toast.LENGTH_SHORT).show();

            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_search, menu);

        MenuItem searchItem = menu.findItem(R.id.item_search);
        SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

            @Override
            public boolean onQueryTextChange(String newText) {
                ArrayList<String> tempList = new ArrayList<>();
                int[] indexs = new int[items.lenght];
                int j = 0;
                for (int i = 0; i < items.length; i++) {


                    if (items[i].toLowerCase().contains(newText.toLowerCase())) {
                        // getting String data
                        tempList.add(items[i]);
                        // getting index for images
                        indexs[j] = i;
                        j++;

                    }
                }
                // MySimpleAdapter with 3 parameters
                adapter = new MySimpleAdapter(MainActivity.this, tempList.toArray(new String[tempList.size()]), indexs);
                listView.setAdapter(adapter);


                return false;
            }

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

        return super.onCreateOptionsMenu(menu);
    }


}

并在 MySimpleAdapter 中

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;



public class MySimpleAdapter extends BaseAdapter {

    private final Activity context;
    private final String[] names;
    private final int[] indexs;

    int[] imgs = {R.drawable.icn1,
            R.drawable.icn2,
            R.drawable.icn3,
            R.drawable.icn4,
            R.drawable.icn5,
            R.drawable.icn6,
            R.drawable.icn7,
            R.drawable.icn8,
            R.drawable.icn9,
            R.drawable.icn10,
            R.drawable.icn11,
            R.drawable.icn12,
            R.drawable.icn13,
            R.drawable.icn14,
            R.drawable.icn15,
            R.drawable.icn16,
            R.drawable.icn17,
            R.drawable.icn18,
            R.drawable.icn19,
            R.drawable.icn20,
            R.drawable.icn21,
            R.drawable.icn22
    };


    static class ViewHolder {
        public TextView text;
        public ImageView image;
    }

    public MySimpleAdapter(Activity context, String[] names, int[] indexs) {
        this.context = context;
        this.names = names;
        this.indexs = indexs;
    }

    @Override
    public int getCount() {
        return names.length;
    }

    @Override
    public Object getItem(int position) {
        return names[position];
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

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

        View rowView = convertView;


        if (rowView == null) {
            LayoutInflater inflater = context.getLayoutInflater();
            rowView = inflater.inflate(R.layout.row_layout, null);
            //Configure view holder
            ViewHolder viewHolder = new ViewHolder();
            viewHolder.text = (TextView) rowView.findViewById(R.id.articleTxt);
            viewHolder.image = (ImageView) rowView.findViewById(R.id.articleImage);
            rowView.setTag(viewHolder);

        }

        ViewHolder holder = (ViewHolder) rowView.getTag();
        String s = names[position];
        int icon;
        if(indexs == null) {
           icon = imgs[position];
        }
        else{
           icon = imgs[indexs[position]];
        }
        holder.text.setText(s);
        holder.text.setTextSize(13);
        holder.image.setImageResource(icon);

        return rowView;
    }
}