在Android中,如何在选中时更新GridView单元格元素控件?

In Android, how to update GridView cell element control when selected?

我正在尝试在 Android 中实现 GridView 以显示产品列表,如下图所示:

使用自定义按钮和网格列表我实现了这个。

我想知道如何在 select 时将此产品按钮设为红色。或者换句话说,我想获取 selected 单元格项目对象并将背景颜色更改为红色,将 TextViews 文本颜色更改为白色。另外,同时,我想将所有剩余的单元格项目设置为默认的白色背景和文本颜色为紫色。

我是 android 的新手,任何帮助都将是巨大的支持。提前致谢。这是我的代码:

片段中的 GridView

<GridView
android:id="@+id/grid_Products"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp"
android:horizontalSpacing="10dp"
android:gravity="center"
android:numColumns="3"
android:stretchMode="columnWidth"
android:verticalSpacing="10dp />

在 ProductFragment class 的 onCreateView() 方法中,我将 productModels 绑定到 gridView

List<ProductModel> productModels;
GridView gdGridView=(GridView)(view.findViewById(R.id.grid_Products));
adapter = new ProductButtonAdaptor(view.getContext(), productModels);
gdGridView.setAdapter(adapter);

product_button.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/btn_product_red"
    android:id="@+id/pnl_ProudctButton"
    android:orientation="vertical">

    <LinearLayout
        android:paddingTop="10dp"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="5"
        android:gravity="center"
        android:layout_gravity="center"
        android:orientation="horizontal">
        <TextView
            android:id="@+id/lbl_ProductName"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="bottom"
            android:text="5"
            android:layout_marginRight="2dp"
            android:textColor="@color/purple"
            android:textAlignment="center"
            android:textSize="30dp"
            android:textStyle="bold" />
        <TextView
            android:id="@+id/lbl_ProductCurrency"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginLeft="2dp"
            android:gravity="bottom"
            android:text="QAR"
            android:textAlignment="center"
            android:textColor="@color/purple"
            android:textSize="20dp"
            android:textStyle="bold" />
    </LinearLayout>

    <View
        android:id="@+id/lbl_ProductSeparator"
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:layout_alignParentBottom="true"
        android:layout_margin="4dp"
        android:background="@color/purple" />

    <TextView
        android:id="@+id/lbl_ProductCategory"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="4"
        android:gravity="top"
        android:text="International"
        android:textAlignment="center"
        android:textColor="@color/purple"
        android:paddingBottom="10dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:textSize="16dp" />

</LinearLayout>

ProductButtonAdpater class:

public class ProductButtonAdaptor extends ArrayAdapter<ProductModel> implements AdapterView.OnItemClickListener
{
private Context context;
private final List<ProductModel> productModels;
private int selected = -1;
public ProductButtonAdaptor(Context context, List<ProductModel> productValues)
{
    super(context, R.layout.button_product, productValues);
    this.context = context;
    this.productModels = productValues;
}

public View getView(int position, View convertView, ViewGroup parent)
{

    LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View gridView;

    if (convertView == null)
    {

        gridView = new View(context);

        // get layout from button_product.xml
        gridView = inflater.inflate(R.layout.button_product, null);

        // set value into textview
        TextView lbl_ProductName = (TextView)gridView.findViewById(R.id.lbl_ProductName);
        TextView lbl_ProductCurrency = (TextView)gridView.findViewById(R.id.lbl_ProductCurrency);
        TextView lbl_ProductCategory = (TextView)gridView.findViewById(R.id.lbl_ProductCategory);
        lbl_ProductName.setText(productModels.get(position).getCode());
        lbl_ProductCurrency.setText(productModels.get(position).getCurrency());
        lbl_ProductCategory.setText(productModels.get(position).getCategoryName());

    }
    else
    {
        gridView = (View)convertView;
    }

    if (selected == position)
    {
        TextView lbl_ProductName = (TextView)gridView.findViewById(R.id.lbl_ProductName);
        TextView lbl_ProductCurrency = (TextView)gridView.findViewById(R.id.lbl_ProductCurrency);
        TextView lbl_ProductCategory = (TextView)gridView.findViewById(R.id.lbl_ProductCategory);
        View lbl_ProductSeperator = (View)gridView.findViewById(R.id.lbl_ProductSeparator);
        LinearLayout pnl_ProductButton = (LinearLayout)gridView.findViewById(R.id.pnl_ProudctButton);

        lbl_ProductName.setTextColor(ContextCompat.getColor(context, R.color.vodafone_white));
        lbl_ProductCurrency.setTextColor(ContextCompat.getColor(context, R.color.vodafone_white));
        lbl_ProductCategory.setTextColor(ContextCompat.getColor(context, R.color.vodafone_white));
        lbl_ProductSeperator.setBackgroundColor(ContextCompat.getColor(context, R.color.vodafone_white));
        pnl_ProductButton.setBackground(ResourcesCompat.getDrawable(context.getResources(), R.drawable.btn_product_red, null));

    }
    else
    {
        //setup the other cells
        TextView lbl_ProductName = (TextView)gridView.findViewById(R.id.lbl_ProductName);
        TextView lbl_ProductCurrency = (TextView)gridView.findViewById(R.id.lbl_ProductCurrency);
        TextView lbl_ProductCategory = (TextView)gridView.findViewById(R.id.lbl_ProductCategory);
        View lbl_ProductSeperator = (View)gridView.findViewById(R.id.lbl_ProductSeparator);
        LinearLayout pnl_ProductButton = (LinearLayout)gridView.findViewById(R.id.pnl_ProudctButton);

        lbl_ProductName.setTextColor(ContextCompat.getColor(context, R.color.vodafone_purple));
        lbl_ProductCurrency.setTextColor(ContextCompat.getColor(context, R.color.vodafone_purple));
        lbl_ProductCategory.setTextColor(ContextCompat.getColor(context, R.color.vodafone_purple));
        lbl_ProductSeperator.setBackgroundColor(ContextCompat.getColor(context, R.color.vodafone_purple));
        pnl_ProductButton.setBackground(ResourcesCompat.getDrawable(context.getResources(), R.drawable.btn_product_white, null));
    }

    return gridView;
}

@Override
public int getCount()
{
    return productModels.size();
}

@Override
public ProductModel getItem(int position)
{
    return productModels.get(position);
}

@Override
public long getItemId(int position)
{
    return 0;
}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
    selected = position;

    this.notifyDataSetChanged();
    //adapter.notifyDataChanged();

    //parent.invalidate();
    //view.invalidate();
}
}

这是更新后的代码

我认为您想以编程方式(而不是样式)进行。

所以,

您必须声明一个 int selected; 变量来存储所选单元格的索引(如果选择了 none,则为 -1)。然后,您必须在每个单元格上实现 onClickListener 并在点击任何元素时更改 selected 值,并使用 notify... 方法重绘所有数据网格单元格。

之后,不要忘记在适配器的相应方法中更改每个销售的颜色设置块和其他参数。

内部onCreate()方法:

gridview.setOnItemClickListener(adapter);

你的class:

public class ProductButtonAdaptor extends BaseAdapter implemets onItemClickListener {
private Context context;
private final ProductModel[] productModels;
private int selected = -1;
public ProductButtonAdaptor(Context context, ProductModel[] productValues) {
    this.context = context;
    this.productModels = productValues;
}

public View getView(int position, View convertView, ViewGroup parent) {

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View gridView;

    if (convertView == null) {

        gridView = new View(context);

        // get layout from button_product.xml
        gridView = inflater.inflate(R.layout.button_product, null);

        // set value into textview
        TextView lbl_ProductName = (TextView) gridView.findViewById(R.id.lbl_ProductName);
        TextView lbl_ProductCurrency = (TextView) gridView.findViewById(R.id.lbl_ProductCurrency);
        TextView lbl_ProductCategory = (TextView) gridView.findViewById(R.id.lbl_ProductCategory);
        lbl_ProductName.setText(productModels[position].Name);
        lbl_ProductCurrency.setText(productModels[position].Currency);
        lbl_ProductCategory.setText(productModels[position].CategoryName);

    } else {
        gridView = (View) convertView;
    }

    if (selected == position) {
    //setup selected cell
    //for example
    gridView.setBackgroundColor(Color.red);
    } else {
    //setup the other cells
    gridView.setBackgroundColor(Color.white);
    }

    return gridView;
}


@Override
public int getCount() {
    return productModels.length;
}

@Override
public Object getItem(int position) {
    return productModels[position];
}

@Override
public long getItemId(int position) {
    return 0;
}


 @Override
public void onItemClick(AdapterView<?> parent, View view,
        int position, long id) {
    selected = position;

    adapter.notifyDataChanged();

//如果你需要,你可以将网格作为构造函数的参数传递 grid.invalidateViews();

}