-2
我想用Gridview创建一个searchView!我用了几个教程来实现,并能实现这一目标。但是当我进入3个字符应用强行关闭..GridView过滤器中的IndexOutOfBoundsException错误
我的适配器代码:
public class CountryViewAdapter extends ArrayAdapter<GridItem> implements Filterable {
private Context mContext;
private int layoutResourceId;
private ArrayList<GridItem> mGridData = new ArrayList<GridItem>();
private ArrayList<GridItem> filerlist = new ArrayList<GridItem>();
CustomFilter filter;
private InputStream mInputStream;
public CountryViewAdapter(Context mContext, int layoutResourceId, ArrayList<GridItem> mGridData) {
super(mContext, layoutResourceId, mGridData);
this.layoutResourceId = layoutResourceId;
this.mContext = mContext;
this.mGridData = mGridData;
this.filerlist = mGridData;
}
/**
* Updates grid data and refresh grid items.
* @param mGridData
*/
public void setGridData(ArrayList<GridItem> mGridData) {
this.mGridData = mGridData;
notifyDataSetChanged();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ViewHolder holder;
if (row == null) {
LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new ViewHolder();
holder.titleTextView = (TextView) row.findViewById(R.id.grid_item_title);
//holder.imageView = (ImageView) row.findViewById(R.id.grid_item_image);
holder.cimageView = (CircleImageView)row.findViewById(R.id.grid_item_image);
row.setTag(holder);
} else {
holder = (ViewHolder) row.getTag();
}
GridItem item = mGridData.get(position);
holder.titleTextView.setText(Html.fromHtml(item.getTitle()));
Log.e(item.getTitle(),Constants.BASE_URL_IMAGE+item.getImage()+".png");
String imageid = item.getId();
imageid = imageid.toLowerCase();
Picasso.with(mContext).load("http://52.221.44.206/mobeeload/countries/png250px/"+imageid+".png").error(R.drawable.mobeeloadicon).into(holder.cimageView);
return row;
}
public static boolean exists(String URLName){
try {
HttpURLConnection.setFollowRedirects(false);
// note : you may also need
// HttpURLConnection.setInstanceFollowRedirects(false)
HttpURLConnection con =
(HttpURLConnection) new URL(URLName).openConnection();
con.setRequestMethod("HEAD");
return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
}
catch (Exception e) {
e.printStackTrace();
return false;
}
}
public String checkImageUri(String uri) {
String val = "false";
try {
mInputStream = mContext.getContentResolver().openInputStream(Uri.parse(uri));
val = "true";
} catch (FileNotFoundException e) {
Log.e("GIfImageView", "File not found");
val="false";
}
return val;
}
static class ViewHolder {
TextView titleTextView;
ImageView imageView;
CircleImageView cimageView;
}
public Filter getFilter(){
if(filter == null){
filter = new CustomFilter();
}
return filter;
}
class CustomFilter extends Filter{
@Override
protected FilterResults performFiltering(CharSequence contraints) {
GridItem item;
FilterResults results = new FilterResults();
if(contraints!= null && contraints.length() > 0){
contraints = contraints.toString().toUpperCase();
ArrayList<GridItem> filters = new ArrayList<GridItem>();
Log.e("SIZE",String.valueOf(filerlist.size()));
for(int i=0;i<filerlist.size();i++){
if(filerlist.get(i).getTitle().toUpperCase().contains(contraints)){
Log.e("TITLE = ",filerlist.get(i).getTitle().toUpperCase());
item = new GridItem();
item.setId(filerlist.get(i).getId());
item.setTitle(filerlist.get(i).getTitle());
item.setImage(filerlist.get(i).getImage());
filters.add(item);
}
}
results.count = filters.size();
results.values = filters;
}
else{
results.count = filerlist.size();
results.values = filerlist;
}
return results;
}
@Override
protected void publishResults(CharSequence contraints, FilterResults result) {
mGridData = (ArrayList<GridItem>) result.values;
notifyDataSetChanged();
}
}
}
我的错误日志是:
FATAL EXCEPTION: main
Process: in.juasoft.mobeeload, PID: 7185
java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.get(ArrayList.java:308)
at in.juasoft.mobeeload.CountryViewAdapter.getView(CountryViewAdapter.java:69)
at android.widget.AbsListView.obtainView(AbsListView.java:2347)
at android.widget.GridView.makeAndAddView(GridView.java:1433)
at android.widget.GridView.makeRow(GridView.java:361)
at android.widget.GridView.fillDown(GridView.java:302)
at android.widget.GridView.fillSpecific(GridView.java:582)
at android.widget.GridView.layoutChildren(GridView.java:1287)
at android.widget.AbsListView.onLayout(AbsListView.java:2151)
at android.view.View.layout(View.java:15685)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1077)
at android.view.View.layout(View.java:15685)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15685)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15685)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15685)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15685)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15685)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2125)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1882)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1099)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5952)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:794)
at android.view.Choreographer.doCallbacks(Choreographer.java:607)
at android.view.Choreographer.doFrame(Choreographer.java:577)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:780)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5290)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:911)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:706)
,一切工作正常。但是,当3个字符的搜索查看正在进入它力与此错误关闭......请帮助我..
UPDATE
终于发现问题: 我忘了在适配器中添加下面的方法。
@Override
public int getCount(){
return mGridData.size();
}
@Override
public GridItem getItem(int pos){
return mGridData.get(pos);
}
@Override
public long getItemId(int pos){
return mGridData.indexOf(getItem(pos));
}
无论如何感谢您的建议和帮助!
它表示大小为3,所请求的索引也为3.数组列表以0开头,所以最大索引将是2,如果大小为3 –
显然这是如何结束扩展'ArrayAdapter'没有正确knowladge ...很明显'getCount'返回初始项计数...这显然会导致调用'getView'位置超出界限过滤项目 – Selvin