【问题标题】:Gridview changing its views if Scrolled如果滚动,Gridview 会更改其视图
【发布时间】:2016-05-09 21:01:02
【问题描述】:

我想在选中时更改网格项目的文本颜色,并且一次只应选择一个项目,这已经完成但是如果 gridview 有很多项目,如果我选择任何项目并滚动 gridview 那么它将选择随机项目在网格中,还允许选择多个项目。 我尝试了很多答案,但没有找到任何单一的解决方案。 任何人都可以有任何想法吗??

我尝试了以下链接给出的答案,但它没有解决我的问题

When the GridView scrolls, it changes its view's activated status

我将与网格视图的适配器 getView 方法和 onItemSelected() 方法共享我的代码

 gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, final int position, long arg3) {

                view.setSelected(true);
                TextView tv = (TextView) view;                 // Get the current selected view as a TextView
                tv.setTextColor(Color.parseColor("#50d1e4"));  // Set the current selected item text color
                TextView previousSelectedView = (TextView) gridview.getChildAt(previousPosition);   // Get the last selected View from GridView

                // If there is a previous selected view exists
                if (previousPosition != -1 && previousPosition!=position) {
                    previousSelectedView.setSelected(false);                        // Set the last selected View to deselect
                    previousSelectedView.setTextColor(Color.parseColor("#162750")); // Set the last selected View text color as deselected item
                }
                previousPosition = position;

        }
    });

这里previousPosition的初始值=-1(是int类型)

适配器的getView方法如下

public static class ViewHolder
{
    public TextView txt_time_slot;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder view;
    final Context context = parent.getContext();
    if (inflater == null)
        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        view = new ViewHolder();
        convertView = inflater.inflate(R.layout.grid_item, null);
        view.txt_time_slot = (TextView) convertView.findViewById(R.id.txt_item_time_slot);
        convertView.setTag(view);
        convertView.setId(0);
    } else {
        view = (ViewHolder) convertView.getTag();
    }

        if (listValues.get(position) != null)
        {
            view.txt_time_slot.setText(listValues.get(position));

        }

    return convertView;
}

这里是 grid_item.xml

 <?xml version="1.0" encoding="utf-8"?>
 <TextView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/txt_item_time_slot"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="10:20 AM"
        android:gravity="center_horizontal"
        android:padding="3dp"
        android:textColor="#162750"
        android:textStyle="bold"
        android:textSize="30sp"/>

【问题讨论】:

  • 其实那些不是随机的项目,那些是被“选中”的重复使用的项目(你叫setSelected)。您应该在适配器中处理选择/取消选择状态。
  • 谢谢@danypata 我现在就试试

标签: java android xml gridview


【解决方案1】:

无需添加previousPosition 变量。 在模型中添加一个参数。您有任何模型的列表,添加一个参数 isSelected(布尔值)。当用户点击它时,将其设置为 true。

在适配器的getView方法中,检查item的isSelected值。您可以从您的列表中获取它(listValue.get(position).isSelected())。根据返回值,您可以更改背景。它还可以帮助您获得选定的值。

例如:

     Product product = mProcucts.get(position);
    itemViewHolder.textView.setText(product.getProductName());
    if(product.isSelected()){   itemViewHolder.textView.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.shape_button_checked));
    }else{
        itemViewHolder.textView.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.shape_button_unchecked));
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多