2010-04-03 2 views
3

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

Как это сделать? Я не могу заставить мой код сделать это. 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 
}; 
} 
+0

Hi AJ, Я хочу сделать то же самое, что и при вызове элемента, который я хочу получить в сетке, а также изменить его образ, как я могу это сделать? У вас теперь есть sloution? С уважением Faheem – 2010-05-05 13:53:35

ответ

2

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

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), который управляет событиями двойного и одного крана, которые вы ищете.

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

how to implement both ontouch and also onfling in a same listview?

Вы бы установить gestureListener как onTouchListener вашего зрения сетки.

7

Используйте 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; 

}

+0

Большое спасибо Pavi !!! – GOLDEE

+0

Поскольку onItemClickListener не захватывает каждое событие с одним касанием, это единственное решение для обработки очень быстрых касаний. –

Смежные вопросы