【发布时间】:2014-02-24 20:09:24
【问题描述】:
我有一些麻烦:我有一个简单的GridView,其中我有两类项目。我想为这个 GridView 添加三个 Menu Buttons 以拥有一个 Filter 并显示/隐藏选择类别的项目。
例如,用下面的图片,第一张图片代表我的简单GridView 和Button in ActionBar。当我按下按钮时,SubMenu 显示三行,例如:“All”、“Open”和“Closed”。当我按下“Open”按钮时,我只想显示类别为“Open”的项目:
我使用工具Filterable 为Search Editext 找到了一些东西,但我认为这不是实现我想要的好方法。我不需要TextView/EditText 作为过滤器,只需要ActionBar 中的按钮。
更新:
注意:我在修改后更新了我的Adapter@ana01's answer。
似乎getView() 被调用一次太多了。我添加了 3 Integers 来计算项目的数量及其类别(nValues = 总数,nOpen = 打开项目的 nb,nClosed = nb of Closed item)。我使用 notifyDataSetChanged() 来更新我的适配器。
这是我的Activity 和我的BaseAdapter:
public class MainActivity extends SherlockActivity {
ActionBar actionbar;
static GridView gridview;
static MyAdapter adapter;
String[] values = new String[] {
"Item 1", "Item 2", "Item 3", "Item 4", "Item 5"
};
// 1 for Open items, 2 for Closed items
int[] vStatus = new int[] {
1, 2, 1, 2, 1
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gridview = (GridView) findViewById(R.id.grid);
adapter = new MyAdapter(this);
gridview.setAdapter(adapter);
gridview.setOnItemClickListener(new OnItemClickListener() {
// new Intent to another Activity
// ...
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.main, menu);
return true;
}
// call an adapter method filterView()
// with the integer sort by category
// 0 = All items | 1 = Open | 2 = Closed
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
return false;
case R.id.action_listfilter_all :
adapter.filterView(0);
return true;
case R.id.action_listfilter_open :
adapter.filterView(1);
return true;
case R.id.action_listfilter_closed :
adapter.filterView(2);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
public class MyAdapter extends BaseAdapter {
private Context mContext;
// Initialize the category's integer "visibleFlag"
private int visibleFlag = 0;
// Initialize the counters' categories
int nValues, nOpen, nClosed;
public MyAdapter(Context c) {
mContext = c;
}
// filterView method called by option selected item menu
public void filterView(int i) {
visibleFlag = i;
// refresh the content
notifyDataSetChanged();
/* gridview.invalidateViews(); */
}
protected class ViewHolder {
TextView text, view, like, user, coms;
ImageView imageview, imageflag;
}
// return the number of items regarding by category selected
public int getCount() {
switch(visibleFlag) {
case 0: nValues = values.length; break;
case 1: nValues = nOpen; break;
case 2: nValues = nClosed; break;
}
return nValues;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
LayoutInflater inflater = ((MainActivity) mContext).getLayoutInflater();
convertView = inflater.inflate(R.layout.item_main, parent, false);
viewHolder = new ViewHolder();
viewHolder.text = (TextView) convertView.findViewById(R.id.text);
viewHolder.imageview = (ImageView) convertView.findViewById(R.id.image);
// set the tag of the category and
// augment the selected category (by + 1)
switch(vStatus[position]) {
case 1: viewHolder.imageview.setTag(1); nOpen++; break;
case 2: viewHolder.imageview.setTag(2); nClosed++; break;
}
// set the tag of the item's position
viewHolder.text.setTag(position);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
// display the text with the position's tag
viewHolder.text.setText(values[(Integer) viewHolder.text.getTag()]);
// display the image with the position's tag
switch((Integer) viewHolder.imageview.getTag()) {
case 1: viewHolder.imageview.setImageResource(R.drawable.ic_open); break;
case 2: viewHolder.imageview.setImageResource(R.drawable.ic_closed); break;
}
return convertView;
}
}
}
但这不会显示所选类别的正确项目!
有人可以帮我弄清楚吗?
【问题讨论】:
标签: android android-gridview android-menu android-adapterview android-filter