0

我試圖在SearchView中查詢Search後嘗試重新顯示ListView的原始值及其各個圖標時出現問題。 ListView第一次顯示帶圖標的項目,但在嘗試搜索時會消失。非常感謝幫助,謝謝。Android編程,ListView圖像在SearchView中查詢期間和查詢後不見了

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

回答

0

改變你的代碼像這樣在主

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; 
    } 
} 
+0

讚賞,但發現錯誤爵士:(這裏編譯應用程序後說: **錯誤:(62,27)錯誤:需要意想不到類型 :參考 發現:INT ** 和 * *錯誤:(66,38)錯誤:找不到符號變量temp ** 在'ArrayList '中檢測到錯誤,其中** int **在'tempList.add(temp);'中也強調爲紅色 ** temp **最後也有紅色 ,'adapter = new MySimpleAdapter(this,items,temIndexList);'括號內的所有下劃線都是紅色的..請幫助.. – JanJan

+0

將'temp'改爲'items [i ]'和'int'爲'Integer',你必須更改MySimpleAdapter類中的代碼,然後才能解決錯誤 – niju

+0

我跟着你評論先生,得到這**一個錯誤**: '錯誤:(71,47)錯誤:不兼容的類型:<匿名OnQueryTextListener>不能轉換爲活動'請幫助先生..謝謝.. – JanJan

0

第一時創建ListView的你當搜索使用MySimpleAdapter發生你調用不同的ArrayAdapeter圖像的id在MySimpleAdapter的內部。您將無法使用這些圖像

+0

謝謝你的筆記先生,但我怎麼能編寫這一個顯示那些圖片呢?請請幫助.. – JanJan