在编程一个GridView变化的ImageViewGridView、ImageView

2023-09-12 04:44:46 作者:看淡世道一切,不过如此、

我已经设置了ImageViews与TextView的叠加网格。我ImageAdapter code是如下:

I've set up a grid of ImageViews with TextView overlays. My ImageAdapter code is as follows:

    public View getView(int position, View convertView, ViewGroup parent) {
    ImageView imageView;
    View grid;
    LayoutInflater inflater = (LayoutInflater) mContext
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        grid = new View(mContext);
        grid = inflater.inflate(R.layout.image, null);
        TextView textView = (TextView)grid.findViewById(R.id.mastery_text);

        imageView = (ImageView)grid.findViewById(R.id.mastery_image);
        grid.setLayoutParams(new GridView.LayoutParams(150, 150));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        grid.setPadding(8, 8, 8, 8);
        grid.setBackgroundResource(R.color.orange);

        imageView.setImageResource(mThumbIds[position]);            

    } else {
        grid = (View) convertView;
    }

    return grid;
}

我ImageAdapter相应的XML布局是这样的:

The corresponding XML layout for my ImageAdapter is this:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout_practitioner" 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ImageView 
        android:id="@+id/mastery_image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
    />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_gravity="bottom"
        android:background="#bbffffff"
        android:focusable="false"
        android:focusableInTouchMode="false" >

        <TextView android:id="@+id/mastery_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="0dp"
            android:textColor="@color/black"
            android:gravity="bottom|center"
            android:textSize="12sp"
            android:textAllCaps="true"
            android:paddingBottom="0dp"
            android:text="3/3"
            />

    </LinearLayout>
</FrameLayout>

XML $ C $下我的GridView(Activity类):

XML code for my GridView (activity class):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <GridView xmlns:android="http://schemas.android.com/apk/res/android"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:id="@+id/gridview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:numColumns="4"
        android:verticalSpacing="10dp"
        android:horizontalSpacing="10dp"
        android:stretchMode="columnWidth"
        android:gravity="center" />

</LinearLayout>

下面是我的主要活动的onCreate方法:

Here is the onCreate method of my main activity:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_masteries);

    GridView gridview = (GridView) findViewById(R.id.gridview);

    ImageAdapter adapter = new ImageAdapter(this);
    gridview.setAdapter(adapter);

    gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v,
                                int position, long id) {
            Toast.makeText(Masteries.this, "" + position,
                    Toast.LENGTH_SHORT).show();
        }
    });
}

我想,初始化网格与图像后,改从我的活动类ImageViews之一,鉴于其对电网的位置。我将如何做呢?

I want to, after initializing the grid with the images, change one of the ImageViews from my activity class, given its position on the grid. How would I do that?

我的没有的要求来改变图像的响应onItemClick。 在此先感谢!

I'm not asking to change the image in response to an onItemClick. Thanks in advance!

编辑: 我想创建一个 changeImage(INT位置,INT imageId)方法,在我的适配器,并要求从我的活动类。那是正确的做法?

I'm thinking of creating a changeImage(int position, int imageId) method in my Adapter and calling that from my activity class. Is that the right approach?

推荐答案

在您的适配器:

public void updateImage(int position, int resourceId)
{
    mThumbIds[position] = resourceId;
    notifyDataSetChanged();
}

在你的活动:

mAdapter.updateImage(<position>, <image_resource_id>);

备注

您将不得不作出适配器您的活动的成员 的主要思想是,你修改后盾数据和并通知的GridView ,这已经改变了,现在是时候重新绘制 您 getView()方法的实现需要大量的改进。这会导致大量的漏洞,一旦系统开始循环的观点(即 convertView 参数进来!=用于其不同的位置空用于最后一次) You will have to make the adapter a member of your activity The main idea is that you modify the backing data and and notify the GridView that this has changed and it is time to be redrawn Your getView() method implementation needs a lot of improvement. It will cause lots of bugs once the system starts recycling the views (the convertView parameter comes in != null for a position different than it was used for last time)

下面是你的getView()应该怎么看起来像一个小品:

Here's a sketch of how your getView() should look like:

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    ViewHolder viewHolder;
    LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = inflater.inflate(R.layout.image, parent, false);
        // next three lines would not be necessary if:
        //  a) it is the same for every item;
        //  b) you inflate properly (using the parent);
        //  c) you specify this in the item's xml (R.layout.image)
        convertView.setLayoutParams(new GridView.LayoutParams(150, 150));
        convertView.setPadding(8, 8, 8, 8);
        convertView.setBackgroundResource(android.R.color.holo_red_light);

        viewHolder = new ViewHolder();
        viewHolder.mTextView = (TextView)convertView.findViewById(R.id.mastery_text);
        viewHolder.mImageView = (ImageView)convertView.findViewById(R.id.mastery_image);
        // this could also be set in xml perhaps
        viewHolder.mImageView.setScaleType(ImageView.ScaleType.CENTER_CROP);

        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder)convertView.getTag();
    }

    // update the values every time we are being asked to update the item,
    // because the item might have been reused from a different position
    viewHolder.mImageView.setImageResource(mThumbIds[position]);
    //viewHolder.mTextView.setText("myText");

    return convertView;
}


public static class ViewHolder
{
    TextView mTextView;
    ImageView mImageView;
}