java - 如何在 GridView 中更改图像?

标签 java android gridview

我对 GridView 有疑问。我想通过 GridView 中的代码(不是 OnClickListener 等)更改图像,但我失去了任何希望...这是我的代码:

图像适配器:

package com.example.rafal.gra;

import android.content.Context;
import android.content.res.Resources;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;


public class ImageAdapter extends BaseAdapter{

private Context CTX;
public Integer image_id[] = {R.mipmap.right_head,R.mipmap.right_head,R.mipmap.right_head,
        R.mipmap.right_head, R.mipmap.right_head, R.mipmap.right_head, R.mipmap.right_head,
R.mipmap.right_head,R.mipmap.right_head,R.mipmap.right_head,R.mipmap.right_head,
        R.mipmap.right_head};

public ImageAdapter(Context CTX){
    this.CTX = CTX;
}

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

@Override
public Object getItem(int position) {
    return null;
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ImageView img;
    int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 80,
            CTX.getResources().getDisplayMetrics());
    if(convertView == null){
        img = new ImageView(CTX);
        img.setLayoutParams(new GridView.LayoutParams(height,height));
        img.setScaleType(ImageView.ScaleType.CENTER_CROP);
        img.setPadding(1,1,1,1);
    }else{
        img = (ImageView) convertView;
    }
    img.setImageResource(image_id[position]);
    return img;
}
}

设备 Activity :

package com.example.rafal.gra;

import android.app.ActionBar;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;

public class EquipmentActivity extends AppCompatActivity {

String postacWeapon, postacShield;
int postacHpotion, postacMpotion;
Backpack backpack;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_equipment);
    final GridView grid = (GridView) findViewById(R.id.gridView);
    grid.setAdapter(new ImageAdapter(this));
    grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Toast.makeText(getBaseContext(), "You clicked on image " + position, Toast.LENGTH_LONG).show();
        }
    });
    odczyt();
    eq();


    backpack = new Backpack("sword_of_faith","","","","","","","","","","","");
    backpack();
}

@Override
public void onBackPressed() {
    AlertDialog.Builder exit = new AlertDialog.Builder(this);
    exit.setMessage("Are you sure you want to exit the application?")
            .setNegativeButton("Yes", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    //zapis();
                    finish();
                    System.exit(0);
                }
            })
            .setPositiveButton("No", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            })
            .create();
    exit.show();
}

public void powrot(View view) {

    //zapis();
    startActivity(new Intent(getApplicationContext(), MainActivity.class));
    finish();

}

public void odczyt() {

    SharedPreferences loadE = getSharedPreferences("Save", MODE_PRIVATE);
    SharedPreferences.Editor editor4 = loadE.edit();
    postacWeapon = loadE.getString("sword", "");
    postacShield = loadE.getString("shield", "");
    postacHpotion = loadE.getInt("hpotion", 0);
    postacMpotion = loadE.getInt("mpotion",0);

}

public void eq() {

    TextView hp = (TextView) findViewById(R.id.textViewHp);
    TextView mp = (TextView) findViewById(R.id.textViewMp);
    hp.setText(Integer.toString(postacHpotion)+"   ");
    mp.setText(Integer.toString(postacMpotion) + "   ");
    ImageView weapon = (ImageView) findViewById(R.id.imageViewWeapon);
    ImageView shield = (ImageView) findViewById(R.id.imageViewShield);

    switch (postacWeapon) {
        case "short_sword":
            weapon.setImageResource(R.mipmap.short_sword);
            break;
        default:
            weapon.setImageResource(R.mipmap.weapon_empty);
    }

    switch (postacShield) {
        case "shield_zero":
            shield.setImageResource(R.mipmap.shield_zero);
            break;
        default:
            shield.setImageResource(R.mipmap.shield_empty);
    }


}

public void backpack(){

    final GridView grid = (GridView) findViewById(R.id.gridView);
    grid.setAdapter(new ImageAdapter(this));
    ImageView slot = (ImageView)     findViewById((int)grid.getItemIdAtPosition(0));
    slot.setImageResource(R.mipmap.sword_of_faith);

}
}

这里最重要的是public void backpack()。在其中我想编写代码来更改 GridView 中的图像。我希望有人能帮助我。

我知道 backpack() 中有一个异常(exception),但我想向您展示我希望如何完成它。

最佳答案

您可以向您的 ImageAdapter 添加一个新方法,如下所示:

public void changeImage(int position, int image){
    if(position >= 0 && position < images_id.length){
        image_id[position] = image;
        notifyDataSetChanged();
    }
}

下面是你如何使用它:

GridView grid = (GridView) findViewById(R.id.gridView);
((ImageAdapter)grid.getAdapter()).changeImage(0, R.mipmap.sword_of_faith);

此外,您应该考虑将 GridViewImageAdapter 实例设置为类变量,这样您就不必在每次需要使用它们时都创建它们。

关于java - 如何在 GridView 中更改图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37104742/

相关文章:

java - 如何将两个ArrayList打印到具有多列的csv文件中?

java - 如何正确处理人类可读的结果?

java - JPA:我应该将 BLOB 存储在与 fetch Lazy 相同的表中,还是应该将其存储到另一个表并 fetch lazy 一对一关系

Android 多个垂直seekBar

c# - 将类的复杂数据源绑定(bind)到 GridView

java - 如何在 GET 请求中获取 rest Controller 中的查询参数?

java - 将 SqlCipher 版本更新到 4.2.0 版本后出现崩溃

java - Android Eclipse 中的 Node.js 和 Websocket

c# - 将列表数据绑定(bind)到 GridView。 GridView 找不到我的属性!

c# - 获取 GridView 列标题文本 - 始终返回空白