Отправьте щелчок в ListView, когда действие реализует OnTOuchListener - PullRequest
0 голосов
/ 06 июля 2011

В моей работе реализован OnTouchListener, и внутри него есть один ListView.Когда пользователь касается ListView, мне нужно отправить ClickEvent в ListView с обработчиком OnItemClickListener.

Как я могу это сделать?

edit:

Каждый элемент списка listView имеет обработчик onTouchEvent.ListView имеет обработчик onItemClick.

  @Override
    public boolean onTouch(View view, MotionEvent event) {
        float actionUpX;

        switch(event.getAction()){

        case MotionEvent.ACTION_DOWN:
            actionDownX = event.getX();
            break;

        case MotionEvent.ACTION_UP:
            actionUpX = event.getX();

            mFlipper = (ViewFlipper) view.findViewById(R.id.view_listitem_flipper);


            if(actionDownX < actionUpX){
                // |--->
                mFlipper.showNext();                
            } else if(actionDownX > actionUpX){
                // <---|
                mFlipper.showPrevious();
            } else {
                    //Click
                    //Need to dispatch itemClickEvent to ListView

                    //view.performClick();  this line causes StackOverflowException 
                    }
            break;
        }
        return true;
    }

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
        long id) {
    //Need do an action using position of view

}

Мой элемент списка является ViewFlipper, когда пользователь касается и перетаскивает элемент, ViewFlipper должен выполнить showNext или ShowPrevious, и onItemClick

должен обработать один щелчок

Ответы [ 2 ]

2 голосов
/ 06 июля 2011

Если вы хотите иметь возможность щелкнуть по элементу в списке и что-то произошло, вам нужно сделать что-то вроде следующего:

public class YourClass extends ListActivity {
    //Your Variables
    ArrayList<Type> yourlist;
    YourAdapterClass adapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        yourlist = new ArrayList<Type>();
        this.adapter = new YourAdapterClass(this, R.layout.row, yourlist);
        setListAdapter(this.adapter);

        //you might be able to see if the below works instead of overriding 
        //the OnListItemClickListener farther below
        ListView lv = getListView();

        lv.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                Log.i("testy", "I Clicked on Row " + position + " and it worked!");
             }
         });
    }

    @Override
    /**
     * When the user selects an item in the list, do an action
     * @param ListView l
     * @param View v
     * @param int position
     * @param long id
     */
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);

        final int index = position;

        //You can add whatever you want to happen when you click here

        Log.i("testy", "I Clicked on Row " + index + " and this overriding worked!");

    }

//other methods can go here for you list


}

Вам также понадобится класс адаптера (в моем примереМой класс адаптера называется YourAdapterClass). Вы можете сделать этот класс закрытым в вашем ListActivty или совершенно новый класс в своем собственном Java-файле, как показано ниже:

public class YourAdapterClass extends ArrayAdapter {
        protected ArrayList items;

        public YourAdapterClass(Context context, int textViewResourceId, ArrayList items) {
            super(context, textViewResourceId, items);
            this.items = items;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = convertView;

            if(v == null) {
                LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.row, null);
            }

          //do stuff to your list view row if it is a custom row with multiple 
          //components like text views, image views etc.

            return v;


       }
}

Обычно этот способ используется для пользовательскихListViews (списки с пользовательскими строками, но вы можете использовать его и для обычного просмотра)

Надеюсь, это поможет вам, по крайней мере, начать работу в правильном направлении.

Удачи.

(это был ответ, который я в основном дал для другой темы, похожей на эту Custom ListVIew и onclick )

0 голосов
/ 06 июля 2011

Может быть, вашей деятельности не нужно реализовывать OnTouchListener? Просто позвольте ListView обработать событие касания. Если вам это не подходит, подумайте о том, чтобы передать сенсорное событие суперклассу, прежде чем обрабатывать его. Это должно правильно отправлять событие или сообщать вам, если никто не обработал его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...