按钮单击时,Android SetImageResource无法在Gridview中工作

时间:2016-10-11 02:31:52

标签: android android-gridview

我尝试在Gridview中显示一些项目并设置按钮单击侦听器。单击该项目时,它会显示一个对话框,如果单击是,则会更改图像视图。

java编码

public class table extends AppCompatActivity implements AdapterView.OnItemClickListener{

GridView gridView;
my_adapter my_adapter;
String table_names[]={"1a","1b","1c","1d","2a","2b","2c","2d","3a","3b","3c","3d"};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_table);

    gridView=(GridView)findViewById(R.id.gridview);
    my_adapter=new my_adapter(this,table_names);
    gridView.setAdapter(my_adapter);
    gridView.setOnItemClickListener(this);
}

@Override
public void onItemClick(final AdapterView<?> adapterView, final View view, final int i, long l) {

    new AlertDialog.Builder(this)
            .setTitle("Table number: "+adapterView.getItemAtPosition(i).toString())
            .setMessage("Open Table?")
            .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    my_adapter.change_img(); // change to new image

                }
            })
            .setNegativeButton("No", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    my_adapter.change_img2(); // change back to original image
                }
            })
            .show();
}
}

class my_adapter extends BaseAdapter{

ImageView imageView;
LayoutInflater inflater=null;
Context ctx;
String table_names[];
ArrayList store_table_no;

my_adapter(Context ctx, String table_names[]){
    this.ctx=ctx;
    this.table_names=table_names;
    store_table_no=new ArrayList<Integer>();
    for (int i=0;i<table_names.length;i++){
        store_table_no.add(table_names[i]);
    }
}

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

@Override
public Object getItem(int i) {
    return store_table_no.get(i);
}

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

@Override
public View getView(int i, View view, ViewGroup viewGroup) {

    View row=view;

    if(row==null){
        inflater=(LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row=inflater.inflate(R.layout.single,null);
    }

    TextView tv_table_no=(TextView)row.findViewById(R.id.table_no);
    imageView=(ImageView)row.findViewById(R.id.imageView);
    tv_table_no.setText(""+store_table_no.get(i));

    return row;
}

public void change_img(){
    imageView.setImageResource(R.drawable.table_full);
}

public void change_img2(){
    imageView.setImageResource(R.drawable.table3d2);
}
}

single.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:text="101"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/table_no"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:textSize="22sp" />

<ImageView
    app:srcCompat="@drawable/table"
    android:id="@+id/imageView"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:layout_width="130dp"
    android:layout_height="100dp" />
</RelativeLayout>

这是截图,请看看

enter image description here

它根本不会改变imageview。看起来我的编码有问题。谁知道发生了什么?

1 个答案:

答案 0 :(得分:1)

您正在实现GridView的OnItemClickListener以显示对话框并从用户处获取每个项目的决策。当您显示对话框时,它需要更新当前单击的网格项。但在你的情况下,你在适配器中有change_img()。没有给适配器指定位置。

要使其正常工作,请将逻辑从活动移至适配器。处理具有位置的点击事件。

在您的活动中,

public class table extends AppCompatActivity{

GridView gridView;
my_adapter my_adapter;
String table_names[] = {"1a", "1b", "1c", "1d", "2a", "2b", "2c", "2d", "3a", "3b", "3c", "3d"};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_grid);

    gridView = (GridView) findViewById(R.id.grid);
    my_adapter = new my_adapter(this, table_names);
    gridView.setAdapter(my_adapter);
}


class my_adapter extends BaseAdapter {

    LayoutInflater inflater = null;
    Context ctx;
    String table_names[];
    ArrayList<String> store_table_no;

    my_adapter(Context ctx, String table_names[]) {
        this.ctx = ctx;
        this.table_names = table_names;
        store_table_no = new ArrayList<>();
        store_table_no.addAll(Arrays.asList(table_names));
    }

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

    @Override
    public Object getItem(int i) {
        return store_table_no.get(i);
    }

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

    @Override
    public View getView(final int i, View view, ViewGroup viewGroup) {

        View row = view;

        if (row == null) {
            inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.single, null);
        }

        RelativeLayout layout = (RelativeLayout) row.findViewById(R.id.relative_layout);
        TextView tv_table_no = (TextView) row.findViewById(R.id.table_no);
        final ImageView imageView = (ImageView) row.findViewById(R.id.imageView);
        tv_table_no.setText(store_table_no.get(i));


        layout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new AlertDialog.Builder(GridActivity.this)
                        .setTitle("Table number: " + store_table_no.get(i))
                        .setMessage("Open Table?")
                        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                imageView.setImageResource(R.mipmap.ic_launcher);
                            }
                        })
                        .setNegativeButton("No", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                imageView.setImageResource(R.drawable.icon);

                            }
                        })
                        .show();
            }
        });
        return row;
    }

}
}

在您的xml文件中,将ID添加到Parent RElative Layout,如下所示,

<强> single.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical" android:layout_width="match_parent"
android:id="@+id/relative_layout"
android:clickable="true"
android:layout_height="match_parent">

<TextView
    android:text="101"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/table_no"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:textSize="22sp" />

<ImageView
    app:srcCompat="@drawable/table"
    android:id="@+id/imageView"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:layout_width="130dp"
    android:layout_height="100dp" />
</RelativeLayout>

我希望它会对你有所帮助。