【问题标题】:Highlight an item from a gridview突出显示网格视图中的项目
【发布时间】:2017-01-07 07:08:39
【问题描述】:

我试图在按下网格视图后突出显示一个项目。 我在 StackOverflow 上看到了一些类似的问题,但没有一个可以通过可能的方式为我的应用程序实现我想要的(由于设计限制或最小 api)。

我的最低 API 是 9,所以我不能使用 Multi_choice_listener。

现在我可以用我想要的颜色设置背景,但是当我按下一个元素时,我也会在屏幕的同一位置按下其他元素(在我滚动 gridview 之后)。

例如,想象一下这个屏幕:

A B C D E F

如果我按 B 然后滚动屏幕,它将显示:

G H 我 JK 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 自定义项的列表。

更新:解决方案是对所选答案的改编。

基本上发生的事情是我很好地设置了视图的背景,但是由于它正在被重用(因为我正在使用视图保持器以提高效率),并且由于该视图已经具有该颜色的背景,所以当它将被重用,它将与该背景颜色一起重用。解决办法就是写一个 else 语句,把背景放回第一种颜色。

【问题讨论】:

  • 它不允许我编辑它,这就是我重新发布它的原因。同样通过这种方式,它会转到最新的,这是大多数人看到的,因为现在我在晚上发布这个,它会接触到“一组新的人”。同样,如果我可以删除其他问题或对其进行编辑,但它不允许我这样做。
  • 但它不允许我删除它,因为它有答案,它说我可能会被阻止
  • 这个问题现在已经解决了。顺便说一句,您在最新评论中标记的第二个问题是一个不同的问题,因为它只是在我用选择器按下它时突出显示,而不是让它具有不同的背景。

标签: android android-layout listview gridview highlight


【解决方案1】:

您需要保存选定的项目位置而不是选定的视图。所以代码看起来像这样:

 @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();
}

【讨论】:

  • setHighlighted 方法是什么?我已经存在了吗?我现在无法测试它,但它看起来不错。
  • 只是伪代码。我只是说这个函数设置视图是否突出显示(设置背景或其他)基于布尔值。
  • 这将是一个很好的解决方案,我使用的是对此的改编。我没有检查列表/添加到列表,而是在我的自定义类上创建了一个表示该项目的属性。基本上发生的事情是我很好地设置了视图的背景,但是由于它正在被重用(因为我正在使用视图保持器来提高效率),并且由于该视图已经具有该颜色的背景,所以当它要被重用,它将与该背景颜色一起重用。解决办法就是写一个 else 语句,把背景放回第一种颜色。
【解决方案2】:

gridview.setItemChecked(position, true);

【讨论】:

  • 里面的selectedListItem是什么?
  • 感谢您的帮助,我使用了不同的解决方案来“检查”该项目,因为根据我的实施它会更容易。但这也是另一种方法。如果您想知道我的解决方案,请查看我在问题上写的更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多