Android новичок: сенсорные события в android gridview - PullRequest
3 голосов
/ 03 апреля 2010

Я использую следующий код для работы с gridview (слегка измененный с http://developer.android.com/resources/tutorials/views/hello-gridview.html).. Я хочу заменить onClicklistener и метод onClick () на их «сенсорные» эквиваленты, например touchlistener и onTouch (), чтобы когда я касаюсь элемента в виде сетки, изображение элемента изменяется, и двойное касание того же элемента возвращает его в исходное состояние.

Как мне это сделать? Я не могу получить свой код для этого. Clicklistener работает до некоторой степени, но сенсорный нет. Пожалуйста, помогите.

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);

        imageView.setOnClickListener(new View.OnClickListener()
            {

              @Override
              public void onClick(View view) 
              {

                  if(position==0)
                  {
                                  //do this
                              }
                              else
                              {
                                //do this
                              }
                           }
                    });

    } else {
        imageView = (ImageView) convertView;
    }

    imageView.setImageResource(mThumbIds[position]);
    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
};
}

Ответы [ 3 ]

7 голосов
/ 11 декабря 2012

Используйте OnTouchListener таким образом. Читайте о типах MotionEvent, таких как ACTION_UP, ACTION_MOVE и ACTION_DOWN, которые означают, что клавиша была нажата здесь, мышь перемещена или клавиша не нажата здесь ...

public void addListenerToGrid() {
    gridView = (GridView) findViewById(R.id.gridView1);

    gridView.setOnTouchListener(new OnTouchListener() {
        public boolean onTouch(View v, MotionEvent me) {

            int action = me.getActionMasked();
            float currentXPosition = me.getX();
            float currentYPosition = me.getY();
            int position = gridView.pointToPosition((int) currentXPosition, (int) currentYPosition);
                        if (action == MotionEvent.ACTION_UP) {
                            // Key was pressed here
                        }

            return true;

}

2 голосов
/ 17 ноября 2010

Исходя из вашего кода, как предложил jaydeepfifadra, вы можете использовать метод setOnItemClickListener вида gride, а не само изображение. (Не сказать, что это невозможно, но я не пробовал).

gridView.setOnItemClickListener(

    new OnItemClickListener(){
        public void onItemClick(AdapterView<?> arg0, View view, int arg2, long arg3) {
            ((Image)view.setSelected(!(Image)view.getSelected()));
        }
    });
);

Теперь я не уверен на 100%, будет ли работать следующее, но в приведенном выше примере я установил состояние view.setSelected () изображения для переключения. Я отчасти догадываюсь, что вы можете установить ресурс изображения для рисования селектора. т.е.

сделайте ваши селекторы ресурсов R.drawable.sample_2, например:

<?xml version="1.0" encoding="utf-8"?>    
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:drawable="@drawable/image_selected" />

    <item android:drawable="@drawable/image_unselected" />
</selector>

Тем не менее, хотя это позволяет вам обнаружить одиночное нажатие, которое будет переключать выбранное состояние. Это не распространяется на двойной кран. Также не существует метода setOnDoubleClickItemListener ().

Таким образом, для вашей конкретной ситуации может потребоваться реализовать GestureDetector и реализовать собственный класс SimpleOnGestureListener (MyGestureListener расширяет SimpleOnGestureListener), который управляет событиями двойного и одиночного касания, которые вы ищете.

Пример реализации слушателя и детектора жестов можно посмотреть здесь.

как реализовать как касание, так и включение в одном и том же списке?

Вы должны установить gestListener как onTouchListener вашего вида сетки.

1 голос
/ 08 сентября 2010

Используйте onItemSelectListener gridView.

...