#java #android
#java #Android
Вопрос:
пожалуйста, помогите с моей проблемой:
у меня есть gridview и TouchListener для его элементов. Проблема в том, что когда я касаюсь элемента, я хочу изменить его фон, и когда касание завершено (действие вверх или вниз), чтобы отобразить начальный фон. проблема в том, что когда я нажимаю на элемент, а затем провожу пальцем по другому элементу, начальный элемент меняет свой фон, но после того, как я провожу пальцем по другому элементу и завершаю касание, фон первого затронутого элемента не меняется на начальный фон. идея заключается в том, что когда я касаюсь элемента из gridview, чтобы получить его блокировку. это может быть код:
package com.mines.gui.components;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import com.mines.globals.GlobalVariables;
public class MinesView extends GridView {
private int[] length = new int[81];
private final Bitmap grid0 = Bitmap.createBitmap(GlobalVariables.icons, 0, 88, 50, 50);
private final Bitmap grid1 = Bitmap.createBitmap(GlobalVariables.icons, 50, 88, 50, 50);
private int id;
public MinesView(Context context) {
super(context);
setAdapter(new MineAdapter(context));
setStretchMode(GridView.NO_STRETCH);
setNumColumns(9);
setHorizontalSpacing(40);
}
class MineAdapter extends BaseAdapter {
private Context context;
public MineAdapter(Context context) {
this.context = context;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public int getCount() {
return length.length;
}
public View getView(int position, View convertView, ViewGroup parent) {
final ImageView imageView;
if(convertView == null) {
imageView = new ImageView(context);
imageView.setLayoutParams(new GridView.LayoutParams(40, 40));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
} else {
imageView = (ImageView) convertView;
}
imageView.setBackgroundDrawable(new BitmapDrawable(grid0));
imageView.setId(position);
imageView.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View arg0, MotionEvent arg1) {
switch (arg1.getAction() amp; MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN:
imageView.setBackgroundDrawable(new BitmapDrawable(grid1));
break;
case MotionEvent.ACTION_OUTSIDE:
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
imageView.setBackgroundDrawable(new BitmapDrawable(grid0));
break;
}
return false;
}
});
imageView.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
// TODO Auto-generated method stub
}
});
return imageView;
}
}
}
Ответ №1:
Попробуйте этот код … создайте ontouchlistener для gridview.
public class HelloGridViewActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(new ImageAdapter(this));
}
public class ImageAdapter extends BaseAdapter {
private Context mContext;
public ImageAdapter(Context c) {
mContext = c;
}
public int getCount() {
return mThumbIds.length;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) { // if it's not recycled, initialize some attributes
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
imageView.setImageResource(mThumbIds[position]);
imageView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
if(event.getAction() == MotionEvent.ACTION_DOWN)
{
v.setBackgroundResource(R.drawable.sample_0);
Log.v("log_tag", "MotionEvent.ACTION_DOWN");
return true;
}
else if(event.getAction()==MotionEvent.ACTION_UP)
{
v.setBackgroundDrawable(null);
Log.v("log_tag", "MotionEvent.ACTION_UP");
return true;
}
return false;
}
});
return imageView;
}
// references to our images
private Integer[] mThumbIds = {
R.drawable.sample_2, R.drawable.sample_3,
R.drawable.sample_4, R.drawable.sample_5,
R.drawable.sample_6, R.drawable.sample_7,
R.drawable.sample_0, R.drawable.sample_1,
R.drawable.sample_2, R.drawable.sample_3,
R.drawable.sample_4, R.drawable.sample_5,
R.drawable.sample_6, R.drawable.sample_7,
R.drawable.sample_0, R.drawable.sample_1,
R.drawable.sample_2, R.drawable.sample_3,
R.drawable.sample_4, R.drawable.sample_5,
R.drawable.sample_6, R.drawable.sample_7
};
}
Комментарии:
1. не работает, даже не входит в цикл if. я не знаю, распознает ли view, когда я касаюсь элемента сетки
2. я решил проблему, изменив суперкласс с кнопки на флажок. dudes…be более полезные советы для начинающих Android