2015-12-19 22 views
0

我想创建一个SearchView,它搜索每个启动特定第二个活动的GridItems。但是我无法弄清楚这个代码对我有什么帮助。我已经为SearchView设置了一个onQueryTextChangeListener,它应该允许我手动显示结果并在输入时显示结果。这是我想要发生的事情:如何在SearchView中将查询分配给GridItem?

当我键入一个特定的查询,比如说“car”,我想向用户显示一辆汽车的GridItem(它只是一个可点击的ImageView)。当我输入“Camera”时,我想向用户显示我的GridItem上的相机图像。

我也想在输入时向用户显示结果,所以当我只输入“c”时,我想向用户显示“car”和“Camera”GridItems。我想留在同一个活动中,所以我需要某种方式来删除所有GridItems,除了那些带有相机或汽车图片的GridItems,这取决于用户输入的内容,我不想启动搜索活动。

现在是什么让这个更难一点是我配置我的BaseAdapter在一个单独的类,这意味着我必须以某种方式间接提及GridItems。这是我到目前为止已经完成:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu, menu); 
    final MenuItem searchItem = menu.findItem(R.id.action_search); 
    SearchView searchView = (SearchView) 
      MenuItemCompat.getActionView(searchItem); 
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextSubmit(String query) { 
     if (query.equals(R.string.Coconut)){ 
     //here I need some code that will tell the system that I want to show the GridItem with a picture of a coconut on it 
     } 
      return false; 
     } 

     @Override 
     public boolean onQueryTextChange(String newText) { 
      return false; 
     } 

这是单独的类初始化的图像在GridView:

class SingleItem{ 
int image; 
double nutritional_value; 

    SingleItem(int image, double nutritional_value){ 
    this.image = image; 
    this.nutritional_value = nutritional_value; 



} 
} 
public class objectAdapter extends BaseAdapter { 
ArrayList<SingleItem> list; 
Context context; 
Bundle myBundle; 

objectAdapter(Context context) { 
    this.context = context; 
    myBundle = new Bundle(); 
    double[][] nutritional_value = { 
      {89, 22.8, 0.3, 1}, 
      {61, 1.5, 0.5, 1.1}, 
      {375, 6.8, 0.6, 1.2}, 
      {767, 0, 9.3, 0}, 
      {580, 9.1, 42, 36.5} 



    }; 
    myBundle.putSerializable("array_array", nutritional_value); 

    int[] image_id = { 
      R.drawable.Bananas, R.drawable.Kiwis, R.drawable.oatmeals, R.drawable.coconuts, 
      R.drawable.dark_chocolate 
    }; 
    for (int i = 0; i < image_id.length; i++) { 
     SingleItem tempSingleItem = new SingleItem(image_id[i], nutritional_value[i][i]); 
     list.add(tempSingleItem); 
    } 
} 


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

    View row = convertView; 
    ViewHolder holder = null; 
    if (row == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row = inflater.inflate(R.layout.single_item, parent, false); 
     holder= new ViewHolder(row); 
     row.setTag(holder); 
    } 
    else { 
     holder = (ViewHolder) row.getTag(); 
    } 
     SingleItem temp = list.get(position); 
     holder.myItem.setImageResource(temp.image); 
    holder.myItem.setTag(temp); 
    return row; 
    } 




@Override 
public long getItemId(int position) { 
    return position; 
} 
class ViewHolder 
{ 
    ImageView myItem; 
      ViewHolder(View v){ 
myItem = (ImageView) v.findViewById(R.id.imageView2); 


      } 
} 

@Override 
public Object getItem(int position) { 
    return list.get(position); 
} 

@Override 
public int getCount() { 
    return list.size(); 
} 


} 

提前感谢!

维达尔

回答

0

你需要某种形式的适配器项和字符串值(名称或字符串数​​组的索引)之间的联系。例如:

class SingleItem{ 
int image; 
double nutritional_value; 
String name; 

    SingleItem(int image, double nutritional_value,String name){ 
    this.image = image; 
    this.nutritional_value = nutritional_value; 
    this.name = name; 


} 
} 

如果您希望在用户键入查询进行更改,你需要重写

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

在ObjectAdapter类进行更改。您需要额外的当前显示项目列表。

public class objectAdapter extends BaseAdapter { 
ArrayList<SingleItem> list; 
ArrayList<SingleItem> filteredItems; 
Context context; 
Bundle myBundle; 

objectAdapter(Context context) { 
    this.context = context; 
    myBundle = new Bundle(); 
    double[][] nutritional_value = { 
      {89, 22.8, 0.3, 1}, 
      {61, 1.5, 0.5, 1.1}, 
      {375, 6.8, 0.6, 1.2}, 
      {767, 0, 9.3, 0}, 
      {580, 9.1, 42, 36.5} 



    }; 
    myBundle.putSerializable("array_array", nutritional_value); 

    int[] image_id = { 
      R.drawable.Bananas, R.drawable.Kiwis, R.drawable.oatmeals, R.drawable.coconuts, 
      R.drawable.dark_chocolate 
    }; 

    int[] name_id = {R.string.Bananas, R.string.Kiwis, R.string.oatmeals, R.string.coconuts, 
      R.string.dark_chocolate 
    }; 
    for (int i = 0; i < image_id.length; i++) { 
     SingleItem tempSingleItem = new SingleItem(image_id[i], nutritional_value[i][i],context.getResources().getString(name_id[i])); 
     list.add(tempSingleItem); 
    } 

    filteredItems = new ArrayList<>(list.size()); 
    filteredItems.addAll(list); 
} 


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

    View row = convertView; 
    ViewHolder holder = null; 
    if (row == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row = inflater.inflate(R.layout.single_item, parent, false); 
     holder= new ViewHolder(row); 
     row.setTag(holder); 
    } 
    else { 
     holder = (ViewHolder) row.getTag(); 
    } 
     SingleItem temp = filteredItems.get(position); 
     holder.myItem.setImageResource(temp.image); 
    holder.myItem.setTag(temp); 
    return row; 
    } 




@Override 
public long getItemId(int position) { 
    return position; 
} 
class ViewHolder 
{ 
    ImageView myItem; 
    ViewHolder(View v){ 
     myItem = (ImageView) v.findViewById(R.id.imageView2); 
    } 
} 

@Override 
public Object getItem(int position) { 
    return filteredItems.get(position); 
} 

@Override 
public int getCount() { 
    return filteredItems.size(); 
} 


public void filter(String text) { 
    filteredItems.clear(); 
    for(int i=0; i < list.size(); ++i) { 
     SingleItem item = list.get(i); 
     if (item.name.toLowerCase().contains(text.toLowerCase()) { 
      filteredItems.add(item); 
     } 
    } 
    notifyDataSetChanged(); 
    } 
} 
+0

我认为这应该工作,谢谢! –

相关问题