突出显示 gridview 中的项目
Highlight an item from a gridview
我试图在按下后突出显示 gridview 中的项目。
我在 Whosebug 上看到了一些类似的问题,但其中 none 可以通过我的应用程序的可能方式满足我的需求(由于设计限制或最小值 api)。
我的最小 API 是 9,所以我不能使用 Multi_choice_listener。
现在我可以用我想要的颜色设置背景,但是当我按下一个元素时,我也会按下屏幕相同位置的其他元素(在我滚动 gridview 之后)。
例如,想象一下这个屏幕:
A B C
D E F
如果我按 B 然后滚动屏幕,它将显示:
G我
J K L
而且H也会被高亮显示(因为他和B在同一个位置)
这是我的 getView 方法:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
viewHolder = null;
if (convertView == null) {
viewHolder=new ViewHolder();
LayoutInflater layoutInflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view=layoutInflater.inflate(R.layout.highwayappselectionitem,parent, false);
viewHolder.appImageIcon=(ImageView) view.findViewById(R.id.highwayGridViewItemIcon);
viewHolder.appNameLabel=(TextView) view.findViewById(R.id.highwayGridViewItemName);
viewHolder.appInfoButton = (ImageView) view.findViewById(R.id.highwayGridViewItemInfoButton);
viewHolder.linearLayout = (LinearLayout) view.findViewById(R.id.HighwayGridViewItem);
}else{
view= convertView;
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.appNameLabel.setText(appsList.get(position).getAppName());
viewHolder.appImageIcon.setImageDrawable(appsList.get(position).getImageIcon());
view.setTag(viewHolder);
viewHolder.linearLayout.setOnClickListener(new MyOnClickListener(position,0));
return view;
}
这是我设置背景的侦听器(在适配器内部)。基本上,如果我从 gridview 中按下一个项目,我希望该项目将背景更改为某种颜色,以便该人知道他们按下了它。
这是我为那个听众编写的代码:
public void onClick(View v) {
if(selectedView==0 || selectedView==1){
appName=appsList.get(position).getAppName();
filePath=appsList.get(position).getFilePath();
appLogo=appsList.get(position).getImageIcon();
v.setBackgroundColor(activity.getResources().getColor(R.color.light_grey));
System.out.println("Just pressed the app ... "+appName);
System.out.println("His filePath is ... "+filePath);
HighwayGridViewAppItem tmpSelectedItem= new HighwayGridViewAppItem(appLogo, appName, filePath);
selectedAppsList.add(tmpSelectedItem);
System.out.println("AppSelectionCUstomAdapter : Added a new application to the list of selected apps .!!!!!!!!!!!!!!!.........");
System.out.println("AppselectioncustomAdaptaer : The size of the selectedAppsList is now : "+selectedAppsList.size());
}else{
//pressed the info button
System.out.println("This will be implemented later, need access to the webservices");
}
}
}
appslist 是我自定义的 gridview 项目的列表。
更新:解决方案是对所选答案的改编。
基本上发生的事情是我很好地设置了视图的背景,但是由于它正在被重复使用(因为我正在使用 viewholder 来提高效率),并且由于该视图已经具有该颜色的背景,当它要被重复使用时,它将与该背景颜色一起重复使用。解决办法就是简单的写一个else语句,把背景恢复成第一种颜色。
您需要保存所选项目位置而不是所选视图。所以代码看起来像这样:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
/.../
if (convertView == null) {
/.../
//click listener now common to all views
viewHolder.linearLayout.setOnClickListener(this);
} else {
/.../
}
//bind possition to viewholder
viewHolder.possition = possition;
viewHolder.setHighlighted(possition == selectedItem);
/.../
}
public void onClick(View v) {
ViewHolder holder =(ViewHolder)v.getTag();
selectedItem = holder.possition;
notifyDataSetChanged();
}
如果您需要多项选择,您可以创建 Set<Integer>
来持有选定的职位。像这样:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
/..../
viewHolder.setHighlighted(selectedItems.contains(position));
/..../
}
public void onClick(View v) {
ViewHolder holder =(ViewHolder)v.getTag();
if (selectedItems.contains(holder.position)) {
selectedItems.remove(holder.position);
} else {
selectedItems.add(holder.position);
}
notifyDataSetChanged();
}
gridview.setItemChecked(位置,真);
我试图在按下后突出显示 gridview 中的项目。 我在 Whosebug 上看到了一些类似的问题,但其中 none 可以通过我的应用程序的可能方式满足我的需求(由于设计限制或最小值 api)。
我的最小 API 是 9,所以我不能使用 Multi_choice_listener。
现在我可以用我想要的颜色设置背景,但是当我按下一个元素时,我也会按下屏幕相同位置的其他元素(在我滚动 gridview 之后)。
例如,想象一下这个屏幕:
A B C D E F
如果我按 B 然后滚动屏幕,它将显示:
G我 J K L
而且H也会被高亮显示(因为他和B在同一个位置)
这是我的 getView 方法:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
viewHolder = null;
if (convertView == null) {
viewHolder=new ViewHolder();
LayoutInflater layoutInflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view=layoutInflater.inflate(R.layout.highwayappselectionitem,parent, false);
viewHolder.appImageIcon=(ImageView) view.findViewById(R.id.highwayGridViewItemIcon);
viewHolder.appNameLabel=(TextView) view.findViewById(R.id.highwayGridViewItemName);
viewHolder.appInfoButton = (ImageView) view.findViewById(R.id.highwayGridViewItemInfoButton);
viewHolder.linearLayout = (LinearLayout) view.findViewById(R.id.HighwayGridViewItem);
}else{
view= convertView;
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.appNameLabel.setText(appsList.get(position).getAppName());
viewHolder.appImageIcon.setImageDrawable(appsList.get(position).getImageIcon());
view.setTag(viewHolder);
viewHolder.linearLayout.setOnClickListener(new MyOnClickListener(position,0));
return view;
}
这是我设置背景的侦听器(在适配器内部)。基本上,如果我从 gridview 中按下一个项目,我希望该项目将背景更改为某种颜色,以便该人知道他们按下了它。
这是我为那个听众编写的代码:
public void onClick(View v) {
if(selectedView==0 || selectedView==1){
appName=appsList.get(position).getAppName();
filePath=appsList.get(position).getFilePath();
appLogo=appsList.get(position).getImageIcon();
v.setBackgroundColor(activity.getResources().getColor(R.color.light_grey));
System.out.println("Just pressed the app ... "+appName);
System.out.println("His filePath is ... "+filePath);
HighwayGridViewAppItem tmpSelectedItem= new HighwayGridViewAppItem(appLogo, appName, filePath);
selectedAppsList.add(tmpSelectedItem);
System.out.println("AppSelectionCUstomAdapter : Added a new application to the list of selected apps .!!!!!!!!!!!!!!!.........");
System.out.println("AppselectioncustomAdaptaer : The size of the selectedAppsList is now : "+selectedAppsList.size());
}else{
//pressed the info button
System.out.println("This will be implemented later, need access to the webservices");
}
}
}
appslist 是我自定义的 gridview 项目的列表。
更新:解决方案是对所选答案的改编。
基本上发生的事情是我很好地设置了视图的背景,但是由于它正在被重复使用(因为我正在使用 viewholder 来提高效率),并且由于该视图已经具有该颜色的背景,当它要被重复使用时,它将与该背景颜色一起重复使用。解决办法就是简单的写一个else语句,把背景恢复成第一种颜色。
您需要保存所选项目位置而不是所选视图。所以代码看起来像这样:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
/.../
if (convertView == null) {
/.../
//click listener now common to all views
viewHolder.linearLayout.setOnClickListener(this);
} else {
/.../
}
//bind possition to viewholder
viewHolder.possition = possition;
viewHolder.setHighlighted(possition == selectedItem);
/.../
}
public void onClick(View v) {
ViewHolder holder =(ViewHolder)v.getTag();
selectedItem = holder.possition;
notifyDataSetChanged();
}
如果您需要多项选择,您可以创建 Set<Integer>
来持有选定的职位。像这样:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
/..../
viewHolder.setHighlighted(selectedItems.contains(position));
/..../
}
public void onClick(View v) {
ViewHolder holder =(ViewHolder)v.getTag();
if (selectedItems.contains(holder.position)) {
selectedItems.remove(holder.position);
} else {
selectedItems.add(holder.position);
}
notifyDataSetChanged();
}
gridview.setItemChecked(位置,真);