简体   繁体   English

在android gridview中实现searchview

[英]Implement searchview in android gridview

i have gridview in my android app which displays images and text so i want to add searchview in gridview so that when i type something in searchview i should be able to see matching gridview items ,,, i have managed to get seachview code for gridview but i am not been able to implement these code in my gridview, here is searchview code 我在显示图像和文本的android应用中有gridview,所以我想在gridview中添加searchview,以便当我在searchview中键入内容时,我应该能够看到匹配的gridview项。我无法在我的gridview中实现这些代码,这是searchview代码

MainActivity 主要活动

public class MainActivity extends Activity {

GridView gv;
SearchView sv;

ArrayAdapter<String> adapter;

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

    // Initial Views
    gv=(GridView) findViewById(R.id.gridView1);
    sv=(SearchView) findViewById(R.id.searchView1);

    // Adapter
    gv.setAdapter adapter

    // Set Adapter
    adapter=new ArrayAdapter<String> (this, android.R.layout.simple_list_item_1.teams);

    sv.setOnQueryTextListener(new OnQueryTextListener() {

        @Override
        public boolean onQueryTextSubmit(String arg0) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean onQueryTextChange(String query) {
            // TODO Auto-generated method stub

            adapter.getFilter().filter(query);

            return false;
        }
    });

}

activity_main activity_main

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
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.searching.MainActivity" >

<GridView
    android:id="@+id/gridView1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentLeft="true"
    android:layout_marginTop="49dp"
    android:numColumns="3" >
</GridView>

<SearchView
    android:id="@+id/searchView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/gridView1"
    android:layout_alignParentTop="true"
    android:queryHint="Search Here"
    android:layout_alignRight="@+id/gridView1" >
</SearchView>

so i want to implement this code in my gridview here is my gridview code 所以我想在我的gridview中实现此代码这是我的gridview代码

MainActivity 主要活动

public class MainActivity extends Activity {
/** Called when the activity is first created. */

private GridviewAdapter mAdapter;
private ArrayList<String> listCountry;
private ArrayList<Integer> listFlag;

private GridView gridView;

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

    prepareList();

    // prepared arraylist and passed it to the Adapter class
    mAdapter = new GridviewAdapter(this,listCountry, listFlag);

    // Set custom adapter to gridview
    gridView = (GridView) findViewById(R.id.gridView1);
    gridView.setAdapter(mAdapter);

    // Implement On Item click listener
    gridView.setOnItemClickListener(new OnItemClickListener() 
    {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                long arg3) {
            Toast.makeText(MainActivity.this, mAdapter.getItem(position), Toast.LENGTH_SHORT).show();
        }
    });

}

public void prepareList()
{
      listCountry = new ArrayList<String>();

      listCountry.add("india");
      listCountry.add("Brazil");
      listCountry.add("Canada");
      listCountry.add("China");
      listCountry.add("France");
      listCountry.add("Germany");
      listCountry.add("Iran");
      listCountry.add("Italy");
      listCountry.add("Japan");
      listCountry.add("Korea");
      listCountry.add("Mexico");  
      listCountry.add("Netherlands");
      listCountry.add("Portugal");  
      listCountry.add("Russia");
      listCountry.add("Saudi Arabia");  
      listCountry.add("Spain");
      listCountry.add("Turkey");
      listCountry.add("United Kingdom");
      listCountry.add("United States");

      listFlag = new ArrayList<Integer>();
      listFlag.add(R.drawable.india);
      listFlag.add(R.drawable.brazil);
      listFlag.add(R.drawable.canada);
      listFlag.add(R.drawable.china);
      listFlag.add(R.drawable.france);
      listFlag.add(R.drawable.germany);
      listFlag.add(R.drawable.iran);
      listFlag.add(R.drawable.italy);
      listFlag.add(R.drawable.japan);
      listFlag.add(R.drawable.korea);
      listFlag.add(R.drawable.mexico);
      listFlag.add(R.drawable.netherlands);
      listFlag.add(R.drawable.portugal);
      listFlag.add(R.drawable.russia);
      listFlag.add(R.drawable.saudi_arabia);
      listFlag.add(R.drawable.spain);
      listFlag.add(R.drawable.turkey);
      listFlag.add(R.drawable.united_kingdom);
      listFlag.add(R.drawable.united_states);
}

GridviewAdapter GridviewAdapter

public class GridviewAdapter extends BaseAdapter {

private ArrayList<String> listCountry;
private ArrayList<Integer> listFlag;
private Activity activity;

public GridviewAdapter(Activity activity,ArrayList<String> listCountry, ArrayList<Integer> listFlag) {
    super();
    this.listCountry = listCountry;
    this.listFlag = listFlag;
    this.activity = activity;
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return listCountry.size();
}

@Override
public String getItem(int position) {
    // TODO Auto-generated method stub
    return listCountry.get(position);
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 0;
}

public static class ViewHolder
{
    public ImageView imgViewFlag;
    public TextView txtViewTitle;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    ViewHolder view;
    LayoutInflater inflator = activity.getLayoutInflater();

    if(convertView==null)
    {
        view = new ViewHolder();
        convertView = inflator.inflate(R.layout.gridview_row, null);

        view.txtViewTitle = (TextView) convertView.findViewById(R.id.textView1);
        view.imgViewFlag = (ImageView) convertView.findViewById(R.id.imageView1);

        convertView.setTag(view);
    }
    else
    {
        view = (ViewHolder) convertView.getTag();
    }

    view.txtViewTitle.setText(listCountry.get(position));
    view.imgViewFlag.setImageResource(listFlag.get(position));

    return convertView;
}

here you go : 干得好 :

sv.setOnQueryTextListener(new OnQueryTextListener() {

    @Override
    public boolean onQueryTextSubmit(String newText) {
        // filter your adapter here 
        private ArrayList<String> listCountrytemp;
        private ArrayList<Integer> listFlagtemp;
        for( int i =0 ; i<listContry.size() ; i++){
             if(listContry(i).contains(newText)){
                       listCountrytemp.add(listContry(i));
                       listFlagtemp.add(listFlag(i));
             }
        }
        return false;
    }

    @Override

public boolean onQueryTextChange(String query) {
    // TODO Auto-generated method stub

    adapter.getFilter().filter(query);

    return false;
}
});

make your adapter take two arguments one for the Country array list and the other for the flags. 使您的适配器使用两个参数,一个用于“国家/地区”数组列表,另一个用于标志。

finally create an adapter with the listCountrytemp and listFlagtemp and send it to the grid view. 最后使用listCountrytemp和listFlagtemp创建一个适配器,并将其发送到网格视图。 i am not familiar with searchviews so i dont know where you should do the last step. 我不熟悉searchviews,所以我不知道您应该在哪里做最后一步。

this may be not the best solution but for me it works just fine. 这可能不是最好的解决方案,但对我来说效果很好。

not that the grid view will update as you type in the search view like facebook search. 并不是说网格视图会随着您在搜索视图(如Facebook搜索)中的键入而更新。

hope this helps 希望这可以帮助

Edit: 编辑:

creating gridview with the new arraylists: 使用新的arraylists创建gridview:

 mAdapter = new GridviewAdapter(this,listCountrytemp , listFlagtemp);

 gridView.setAdapter(mAdapter);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM