【问题标题】:Dynamically change the image color layout in a row in a GridView动态更改 GridView 中一行中的图像颜色布局
【发布时间】:2013-11-08 13:46:00
【问题描述】:

当我在 GridView 的布局中选择项目时,如何更改图像的颜色(不是背景!)?我重载了onItemClick()方法,但不太清楚如何引用地址具体元素(选择的那个)。

您现有的代码,row.xml:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="5dp" >

        <ImageView
            android:id="@+id/rowImage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="10dp"
            android:src="@drawable/ic_launcher" >
        </ImageView>

        <TextView
            android:id="@+id/rowText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="5dp"
            android:textSize="15sp"
            android:textStyle="bold" >
        </TextView>
</LinearLayout>

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/gridView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:columnWidth="150dp"
    android:gravity="center"
    android:numColumns="auto_fit"
    android:stretchMode="columnWidth" >

</GridView>

ImageAdapter.class:

package com.example.exchangemanager;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class ImageAdapter extends ArrayAdapter<Item> {

    Context context;
    int layoutResourceId;
    ArrayList<Item> data = new ArrayList<Item>();

    public ImageAdapter(Context context, int layoutResourceId,
            ArrayList<Item> data) {
        super(context, layoutResourceId, data);

        this.context = context;
        this.layoutResourceId = layoutResourceId;
        this.data = data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        RecordHolder holder = null;

        if (row == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);

            holder = new RecordHolder();
            holder.textView = (TextView) row.findViewById(R.id.rowText);
            holder.imageView = (ImageView) row.findViewById(R.id.rowImage);
            row.setTag(holder);
        } else {
            holder = (RecordHolder) row.getTag();
        }

        Item item = data.get(position);
        holder.textView.setText(item.getTitle());
        holder.imageView.setImageBitmap(item.getImage());
            // My previous attempts
        holder.imageView.setColorFilter(Color.GRAY);
        return row;
    }

    static class RecordHolder {
        TextView textView;
        ImageView imageView;
    }
}

MainActivity.class,重载onItemClick()方法:

gridView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v,
                    int position, long id) {
            }
        });

正如您在文件 ImageAdapter.class 中看到的那样,我可以在颜色上绘制图像,但在选择时我无法将颜色改回。

【问题讨论】:

  • 我已经编辑了我的答案,我认为这应该可行。最好你检查一下。
  • 我很抱歉我是一个“恶意”,但不幸的是它不起作用。我的意思是它确实是什么,但是当我重写你的代码时,它可以工作,但我点击哪一行并不重要,并且总是只选择第一行。我试图检索X和Y的位置,然后将它们转换为位置行,但是应用程序被踢除了“java空指针异常”。
  • 我已经更新了我的答案(再次)兄弟..这一次,我认为它应该按预期工作。看看吧。。
  • 是的,它成功了!感谢您的帮助和时间

标签: android gridview onitemclick


【解决方案1】:

更新答案(再次):

首先,您需要创建一个接口:右键单击您的包项目 -> 新建 -> 接口(例如,将其命名为 OnMyGridTouchListener)
其次,在我们的接口上添加一个公共方法:

public interface OnMyGridTouchListener {
    public void onMyGridTouch(ImageView imgView, int action);
}

第三,使用适配器内部的接口。它应该是这样的:

private OnMyGridTouchListener myGridTouchListener;
...
public ImageAdapter(Context context, int layoutResourceId, ArrayList<Item> data) {
    ...
    myGridTouchListener = (OnMyGridTouchListener) context;
    ...
}

...
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ...
    holder.imageView.setImageBitmap(item.getImage());

    // here is our interface should be used
    final ImageView finalImageView = holder.imageView;
    row.setOnTouchListener( new OnTouchListener(){

        @Override
        public boolean onTouch(View v, MotionEvent event){
            myGridTouchListener.onMyGridTouch(finalImageView, event.getAction());
            return true;
        }

    }

    return row;
}

接下来,转到您的活动并实施到 OnMyGridTouchListener,应该是这样的:

public class MyActivity extends Activity implements OnMyGridTouchListener {
    ...
    ...

    @Override
    public void onMyGridTouch(ImageView imgView, int action){

        if(action==MotionEvent.ACTION_DOWN){
            imgView.setColorFilter(Color.WHAT_COLOR_YOU_WANT);
        }
        else if(action==MotionEvent.ACTION_UP){
            imgView.setColorFilter(Color.WHAT_COLOR_YOU_WANT);
        }

    }

最后,完成!

【讨论】:

  • 是的,它有效,非常感谢。关于字段的释放,我有一个小问题,再次将颜色更改为灰色?类似于 onNothingSelected() 方法的内容,不幸的是它不在 setOnItemClickListener() 中
  • 什么都没变,只是加了你给我的代码(onItemClick方法一模一样)。我不知道如何才能完全返回,然后松开按钮来更改颜色。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-09
相关资源
最近更新 更多