【问题标题】:Display One more Image on top of that clicked grid item在单击的网格项目顶部再显示一个图像
【发布时间】:2013-03-18 11:57:12
【问题描述】:

我有 4 个项目的网格视图,现在单击每个网格项目我需要在单击的网格项目上再显示一个图像。

如何做到这一点?

这是我的适配器类获取视图:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder view;
    LayoutInflater inflator = activity.getLayoutInflater();

    GridView.LayoutParams params = null;
    if (convertView == null) {
    view = new ViewHolder();
    convertView = inflator.inflate(R.layout.tile_row, null);

    view.textView = (TextView) convertView.findViewById(R.id.title);
    view.imageView = (ImageView) convertView.findViewById(R.id.icons);
    convertView.setTag(view);

    params = new GridView.LayoutParams(Width, Height);
    convertView.setLayoutParams(params);
    } else {
    view = (ViewHolder) convertView.getTag();
    }
    // set image view parameters
    setImageParamaeters(view.imageView);

    view.textView.setText(adapterNames.get(position));
    view.imageView.setImageResource(adapterIcondIds.get(position));

    if (params != null) {
    convertView.setLayoutParams(params);
    }

    convertView.setId(position);
    convertView.setOnClickListener(onClickListeners.get(position));

    return convertView;
}

【问题讨论】:

  • 被点击后要在网格项上放多少张图片
  • 中间只有一张图片
  • 检查编辑后的答案
  • 用更多解释更新了答案,希望对您有所帮助

标签: android image gridview


【解决方案1】:

您可以通过在网格项目顶部放置一个弹出窗口来做到这一点。 为了找到网格项目在屏幕上的确切位置,您可以使用以下代码

Rect loc = new Rect();
int[] location = new int[2];
view.getLocationOnScreen(location);
loc.left = location[0];
loc.top = location[1];
loc.right = loc.left + view.getWidth();
loc.bottom = loc.top + view.getHeight();

变量loc 保存被点击的view 在屏幕上的确切位置,这只是方法的第二个参数

@Override
public void onItemClick(AdapterView<?> parent, View view,
        int position, long id) {
    // TODO Auto-generated method stub  
}

有了这些信息,您可以轻松实现所需。最好是计算视图的中心,并将弹出窗口的中心与单击视图的中心对齐。

注意:如果部分视图可见,您将需要调整显示弹出窗口。

已编辑: 由于我没有收到您的问题,因此我添加了一张图片以提高清晰度。

我已经提供了案例 1 的代码。对于案例 2,您需要修改布局,您可以在单击网格项目时显示叠加图像

已编辑:实施案例 2

修改了适配器代码,移动了一些变量以进行优化

public CustomAdapter(Activity activity, ...){
    inflator = activity.getLayoutInflater();
...
}
LayoutInflater inflator;

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder view;

    if (convertView == null) {
        view = new ViewHolder();
        convertView = inflator.inflate(R.layout.tile_row, null);

        view.textView = (TextView) convertView.findViewById(R.id.title);
        view.imageView = (ImageView) convertView.findViewById(R.id.icons);
        view.clickedImage = (ImageView) convertView.findViewById(R.id.clickedImage);
        convertView.setTag(view);
    } else {
        view = (ViewHolder) convertView.getTag();
    }
    // set image view parameters
    view.textView.setText(adapterNames.get(position));
    view.imageView.setImageResource(adapterIcondIds.get(position));
    //add a int variable to the view holder
    view.position = position;
    if(position != clickedPosition){
        view.clickedImage.setVisibility(View.GONE);
    }
    convertView.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            ViewHolder holder = (ViewHolder)v.getTag();
            clickedPosition = holder.position;
            holder.clickedImage.setVisibility(View.VISIBLE);
            //you can also set the resource of the imageview here.
            notifyDataSetChanged();
        }
    });

    return convertView;
}
//this is used for resetting the previous view when a new view is clicked
int clickedPosition = -1;

为了在网格视图中保留项目的单击状态,我将 单击网格的项目位置。现在在 onClick 我改变可见性 单击的图像(处于 GONE 状态),更新变量 clickedPosition 并简单地调用 notifyDataSetChanged。这说明 数据集已更改的适配器和所有的 getView 可见的网格项目将被调用。因此,如果您最初单击项目 1, 然后点击 item 3 然后你会注意到 item 1 已经被重置 单击第 3 项时。

XMLtitle_row.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="200dp"
    android:layout_height="200dp" >

    <ImageView
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:src="@drawable/droid_logo_black"
        android:visibility="gone" />

    <ImageView
        android:id="@+id/clickedImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:src="@drawable/login_help_logo" />

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="Title"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</RelativeLayout>

【讨论】:

  • 嘿,我想在点击的网格项目上再显示一张图片,但你的回答在这里有所不同
  • 你能添加一个图表来解释吗,我得到的是,如果你点击第 3 项,他们第 3 项被下推到 4,并在第 3 位添加了一个额外的图像,如果是这样的话它非常简单,如果您确认我可以添加更多代码
  • 不,我的网格项目没有改变,它们仍然存在于任何地方,只是单击一个项目会再显示一个单击项目顶部的图像
  • 嘿,谢谢,你在案例 2 中是完全正确的,但我的问题是我没有使用 xml,我正在以编程方式添加网格视图。但我不知道该怎么做
  • 发布你的适配器代码,我会修改它,但是不管你为什么不使用 xml,使用 xml 都有助于快速更好地设计视图
【解决方案2】:

在元素的onClickListener中,调用imageView,动态加载图片。 或者预定义图片资源,使用新图片的id调用Imageview。

【讨论】:

  • 老兄,只有将图像设置为背景的选项吗?但是你怎么把它设置为froeground?
【解决方案3】:

onlclick of each grid item i need to display one more image on top of that clicked grid item.

我认为您必须创建自定义网格视图。并根据需要动态附加 ImageView。

setVisibilty(View.Visible) 表示您想显示,setVisibilty(View.Hide) 表示您不想显示。

【讨论】:

    【解决方案4】:
    int id = getResources().getIdentifier("yourpackagename:drawable/" + StringGenerated, null,     null);
    

    试试这种方法,你会得到 id。尝试使用

    更改图像
    imageview.setImageResource(id);
    

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      相关资源
      最近更新 更多