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;
}
}
尝试在 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;
}
}