首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果我们也在android的ListView中使用onTouchListener,如何调用onListItemClick?

如果我们也在android的ListView中使用onTouchListener,如何调用onListItemClick?
EN

Stack Overflow用户
提问于 2013-12-26 16:37:54
回答 1查看 865关注 0票数 0

当我在我的listview中添加ontouchListener时,onListItemClick不工作。

我想在列表视图中使用OnTouchListeneronListItemClick来实现单击,因为我使用来自onListItemClick的position来创建新的activity,并使用ontouch来实现快速滑动手势。

代码语言:javascript
复制
public class FRAG1 extends ListFragment {

    private static final String KEY_VIDEO_PATH = "AAA-1";
    private static final String KEY_VIDEO_TITLE = "AAA-2";
    private static final String KEY_VIDEO_ARTIST = "AAA-3";
    private static final String KEY_VIDEO_DURATION = "AAA-4";
    private static final String KEY_VIDEO_ID = "AAA-5";

    private static final Uri sourceUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
    private static final String[] projection = { MediaStore.Video.Media._ID,
            MediaStore.Video.Media.DATA, MediaStore.Video.Media.TITLE,
            MediaStore.Video.Media.DISPLAY_NAME, MediaStore.Video.Media.ARTIST,
            MediaStore.Video.Media.DURATION };
    private static final String orderBy = MediaStore.Video.Media.DATE_ADDED;

    /* THE DESIRED COLUMNS TO BE BOUND */
    private static final String[] from = { MediaStore.Video.Media.TITLE,
            MediaStore.Video.Media.ARTIST, MediaStore.Video.Media.DURATION };

    /* THE XML DEFINED VIEWS WHICH THE DATA WILL BE BOUND TO */
    private static final int[] to = { R.id.list_Title, R.id.list_Artist,
            R.id.list_Duration };

    private static Cursor videoCursor;
    private static int videoPathColumnIndex;
    private static int videoTitleColumnIndex;
    private static int videoArtistColumnIndex;
    private static int videoDurationColumnIndex;
    private static int videoIdColumnIndex;

    private static String videoPath;
    private static String videoTitle;
    private static String videoArtist;
    private static int videoDuration;
    private static int videoId;

    /* GET THE CONTEXT OF LISTFRAGMENT FROM HOMEPAGE ACTIVITY */
    Context context;

    /* TO LUNCH 2nd CLASS AND PUT MEDIA INFO INTO */
    private static Intent vIntent;

    /* MY CUSTOM ADAPTER */
    private static MyCustomSimpleCursorAdapter adapter;

    /* GESTUREDETOR FOR COMPATIBILITY */
    GestureDetectorCompat detector;

    /* MY LISTVIEW */
    ListView lv;

    /* CUSTOM TYPE INFLATION IF NEED TO ADD MORE VIEW IN LISTVIEW XML LAYOUT */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.frag_this_week, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        context = getActivity();

        // CREATE CURSOR THAT WILL HOLD ALL VALUE
        videoCursor = context.getContentResolver().query(sourceUri, projection,
                null, null, orderBy);

        // CREATE THE ADAPTER USING THE CURSOR POINTING TO THE
        // DESIRED DATA AS WELL AS THE LAYOUT INFORMATION
        adapter = new MyCustomSimpleCursorAdapter(context,
                R.layout.list_row_items, videoCursor, from, to);

        setListAdapter(adapter);

        // GET THE INSTANCE OF LISTVIEW FOR THE SWIPEVIEW PURPOSE
        lv = getListView();

        detector = new GestureDetectorCompat(context,
                new MyOnSwipeTouchListener());

        lv.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                Toast.makeText(context, "true", Toast.LENGTH_SHORT).show();
                System.out.println("true");
                return detector.onTouchEvent(event);
            }
        });

        lv.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // MOVE TO CLICK POSITION
                if (videoCursor.moveToPosition(position)) {
                    // GET THE COLUMN INDEX OF THE FILEPATH, TITLE, ARTIST,
                    // DURATION
                    videoPathColumnIndex = videoCursor
                            .getColumnIndexOrThrow(MediaStore.Video.Media.DATA);
                    videoTitleColumnIndex = videoCursor
                            .getColumnIndexOrThrow(MediaStore.Video.Media.TITLE);
                    videoArtistColumnIndex = videoCursor
                            .getColumnIndexOrThrow(MediaStore.Video.Media.ARTIST);
                    videoDurationColumnIndex = videoCursor
                            .getColumnIndexOrThrow(MediaStore.Video.Media.DURATION);
                    videoIdColumnIndex = videoCursor
                            .getColumnIndexOrThrow(MediaStore.Video.Media._ID);

                    // LIST THE DATA OF THE COLUMNINDEX OF THE VIDEOCURSOR
                    // POSITION
                    videoPath = videoCursor.getString(videoPathColumnIndex);
                    videoTitle = videoCursor.getString(videoTitleColumnIndex);
                    videoArtist = videoCursor.getString(videoArtistColumnIndex);
                    videoDuration = videoCursor
                            .getInt(videoDurationColumnIndex);
                    videoId = videoCursor.getInt(videoIdColumnIndex);

                    // START THE NEW INTENT ACTIVITY AND PASS SOME MEDIA INFO
                    vIntent = new Intent(getActivity(), Play.class);

                    vIntent.putExtra(KEY_VIDEO_PATH, videoPath);
                    vIntent.putExtra(KEY_VIDEO_TITLE, videoTitle);
                    vIntent.putExtra(KEY_VIDEO_ARTIST, videoArtist);
                    vIntent.putExtra(KEY_VIDEO_DURATION, videoDuration);
                    vIntent.putExtra(KEY_VIDEO_ID, videoId);

                    startActivity(vIntent);
                }
            }
        });
    }

    /** NESTED CLASS FOR MY CUSTOM SWIPE TOUCH LISTENER */
    public class MyOnSwipeTouchListener extends
            GestureDetector.SimpleOnGestureListener {

        @Override
        public boolean onDown(MotionEvent event) {
            return true;
        }

        @Override
        public boolean onFling(MotionEvent event1, MotionEvent event2,
                float velocityX, float velocityY) {
            Toast.makeText(context, "on fling", Toast.LENGTH_SHORT).show();
            return true;
        }
    }
}

这是我的自定义光标适配器

代码语言:javascript
复制
/* CUSTOM ADAPTER FOR TABTHISWEEK */
public class MyCustomSimpleCursorAdapter extends SimpleCursorAdapter {

    private static int layout;
    private static LayoutInflater inflater;
    private MyViewHolder holder;

    public MyCustomSimpleCursorAdapter(Context context, int layout,
            Cursor cursor, String[] from, int[] to) {
        super(context, layout, cursor, from, to, 0);

        MyCustomSimpleCursorAdapter.layout = layout;
        MyCustomSimpleCursorAdapter.inflater = LayoutInflater.from(context);
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        return inflater.inflate(layout, parent, false);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        super.bindView(view, context, cursor);

        holder = (MyViewHolder) view.getTag();

        if (holder == null) {
            holder = new MyViewHolder();

            holder.titleHolder = (TextView) view.findViewById(R.id.list_Title);
            holder.artistHolder = (TextView) view
                    .findViewById(R.id.list_Artist);
            holder.durationHolder = (TextView) view
                    .findViewById(R.id.list_Duration);
            holder.imageHolder = (ImageView) view.findViewById(R.id.list_Image);
            holder.playHolder = (ImageButton) view.findViewById(R.id.list_Play);


            view.setTag(holder);
        }



        /*
         * GET THE COLUMN INDEX OF TITLE, ARTIST, DURATION AND
         * THE ROWID OF THE VIDEO IMAGE THUMBNAIL PER LOOP
         */
        holder.titleIndex = cursor
                .getColumnIndexOrThrow(MediaStore.Video.Media.TITLE);
        holder.artistIndex = cursor
                .getColumnIndexOrThrow(MediaStore.Video.Media.ARTIST);
        holder.durationIndex = cursor
                .getColumnIndexOrThrow(MediaStore.Video.Media.DURATION);
        holder.imageIndex = cursor.getInt(cursor
                .getColumnIndexOrThrow(MediaStore.Video.Media._ID));

        /* SET THE TITLE BUT IF NULL SET TO DEFAULT FROM RESOURCES */
        try {
            holder.titleHolder.setText(cursor.getString(holder.titleIndex));
        } catch (Exception e) {
            e.printStackTrace();
            Log.d("XXXXXX" + e.getMessage(), e.getMessage());
            holder.titleHolder.setText(context.getResources().getString(
                    R.string.list_view_default_text_title));
        }

        /* SET THE ARTIST BUT IF NULL SET TO DEFAULT FROM RESOURCES */
        try {
            holder.artistHolder.setText(cursor.getString(holder.artistIndex));
        } catch (Exception e) {
            e.printStackTrace();
            Log.d("XXXXXX" + e.getMessage(), e.getMessage());
            holder.artistHolder.setText(context.getResources().getString(
                    R.string.list_view_default_text_artist));
        }

        /* SET THE TIME DURATION IF NULL SET TO DEFAULT */
        try {
            holder.milliseconds = Integer.parseInt(cursor
                    .getString(holder.durationIndex));

            holder.seconds = holder.milliseconds / 1000;
            holder.minutes = holder.seconds / 60;
            holder.seconds = holder.seconds % 60;
            holder.minutes = holder.minutes % 60;

            holder.durationHolder.setText(String.format("%2d:%02d",
                    holder.minutes, holder.seconds));
        } catch (Exception e) {
            e.printStackTrace();
            Log.d("XXXXXX" + e.getMessage(), e.getMessage());
            holder.durationHolder.setText(context.getResources().getString(
                    R.string.list_view_default_text_duration));
        }

        /* SET THE BITMAP IMAGE FOR THE IMAGEVIEW */
        try {
            holder.options = new BitmapFactory.Options();
            holder.options.inDither = false;
            holder.options.inPreferredConfig = Bitmap.Config.ARGB_8888;

            holder.bitmapVidThumb = MediaStore.Video.Thumbnails.getThumbnail(
                    context.getContentResolver(), holder.imageIndex,
                    MediaStore.Video.Thumbnails.MICRO_KIND, null);
            holder.imageHolder.setImageBitmap(holder.bitmapVidThumb);
        } catch (Exception e) {
            e.printStackTrace();
            Log.d("XXXXXX" + e.getMessage(), e.getMessage());
            holder.imageHolder.setBackgroundDrawable(context.getResources()
                    .getDrawable(R.drawable.default_img));
        }

        /* SET DEFAULT VALUE IF TITLE IS NULL */
        if (holder.titleHolder.getText().toString().equals("")) {
            holder.titleHolder.setText(context.getResources().getString(
                    R.string.list_view_default_text_title));
        }

        /* SET DEFAULT VALUE IF ARTIST IS NULL */
        if (holder.artistHolder.getText().toString().equals("")) {
            holder.artistHolder.setText(context.getResources().getString(
                    R.string.list_view_default_text_artist));
        }
    }

    /* MY NESTED VIEW HOLDER CLASS */
    static class MyViewHolder {
        BitmapFactory.Options options;
        Bitmap bitmapVidThumb;

        ImageButton playHolder;

        ImageView imageHolder;
        TextView titleHolder;
        TextView artistHolder;
        TextView durationHolder;

        Integer milliseconds;
        Integer seconds;
        Integer minutes;

        int imageIndex;
        int titleIndex;
        int artistIndex;
        int durationIndex;

        int durationTemp;
    }
}

有关我的问题的详细信息,请更新我的代码

EN

回答 1

Stack Overflow用户

发布于 2013-12-26 17:51:00

你的问题并不是你在想什么,你需要重写

onListItemClick的ListView类的setOnItemClickListener(新的OnItemCLickListener)方法,并将它与setOnTouchListener一起使用,你会得到完美的结果,她的示例代码展示了这两个方法的作用。

代码语言:javascript
复制
ListView list = new ListView(MainActivity.this);
    list= (ListView) findViewById(R.id.list);
    String [] men = { "RJ" ,"DJ ", " Snoop " , " Doogy " ," Doggg" , "2 pac"};

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_expandable_list_item_1,men);
    list.setAdapter(adapter);
    list.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
        System.out.println("hello");

            return false;
        }
    });

list.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
        // TODO Auto-generated method stub

        System.out.println(arg2);

    }
});    

让我知道这是否是你要找的

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20781734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档