ListView单击左侧或右侧

时间:2014-10-21 08:46:07

标签: android listview

我有一个ListView,当你点击一个项目时,我想检查该项目是在左侧还是右侧点击。这是我的代码:

package com.testapp.toroco;

import android.support.v4.app.ListFragment;
import android.graphics.Point;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class FragmentA extends ListFragment implements OnClickListener {

int width;
public void onCreate(Bundle b) {
    super.onCreate(b);
    getSize();
}
public void getSize(){
    Display display = getActivity().getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    width = size.x;
}

@Override
  public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    String[] itemlist = {"A","b","C","d","E","f"};
    ArrayAdapter<String> adapter = new ArrayAdapter<String>  (getActivity(),R.layout.layoutrow,R.id.name,itemlist);
    setListAdapter(adapter);
  }
@Override
  public void onListItemClick(ListView l, View v, int position, long id) {
    // do something with the data
  }
public boolean dispatchTouchEvent(MotionEvent event) {
    int actionX = (int) event.getX();

int middlePoint = width/2 ; 

if(actionX >middlePoint ){
    Log.d("Touch", "Right");
}else if (actionX <middlePoint ){
    Log.d("Touch", "Left");
}

                return false;
}
@Override
public void onClick(View v) {
    // TODO Auto-generated method stub

}
}

我知道我没有正确添加监听器,并且onListItemClick和dispatchTouchEvent当前是两个单独的事件。但不幸的是,我现在已经知道如何实现这一目标。有没有更好的方法来找出它被点击的哪一半?如果没有,我必须在哪个View上注册ClickListener,如何创建一个事件(onListItemClick和dispatchTouchEvent)检查另一个事件的结果?

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:2)

Tweek!您可以使用自定义布局创建自定义列表视图,您可以在其中向左侧和右侧添加两个视图,为这两个视图添加setOnClickListeners()。

修改

我给你一个如何做的例子。

为列表项创建xml布局:listItem.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:weightSum="1" >

    <LinearLayout
        android:id="@+id/leftPart"
        android:layout_width="0dip"
        android:layout_height="10dp"
        android:orientation="vertical"
        android:layout_weight="0.5"
        android:background="#ff0000" >
    </LinearLayout>

    <LinearLayout
        android:id="@+id/rightPart"
        android:layout_width="0dip"
        android:layout_height="10dp"
        android:orientation="vertical"
        android:layout_weight="0.5"
        android:background="#00ff00" >
    </LinearLayout>

</LinearLayout>

为listView编写自定义适配器:CustomListAdapter.java

public class CustomListAdapter extends ArrayAdapter<String> {
    int resource;

    // change String to your required datatype 
    public CustomListAdapter(Context context, int resource, int textViewResourceId, String[] objects) {
        super(context, resource, textViewResourceId, objects);
        this.resource = resource;
        // TODO Auto-generated constructor stub
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(resource, parent, false);
        }

        final int pos = position;
        convertView.findViewById(R.id.leftPart).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // Do your work here
                Toast.makeText(getContext(), "Left Side of " + pos + "th element clicked", Toast.LENGTH_SHORT).show();

            }
        });

        convertView.findViewById(R.id.rightPart).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // Do your work here
                Toast.makeText(getContext(), "Right Side of " + pos + "th element clicked", Toast.LENGTH_SHORT).show();

            }
        });

        return convertView;
    }

}

将适配器设置为ListView,如下所示,

yourListView.setAdapter(getActivity(),R.id.listItem, /*your data*/);

我还没有测试过这段代码,但这应该可行。

答案 1 :(得分:0)

在dispatchTouchEvent方法中:

public boolean dispatchTouchEvent(MotionEvent event) {

   switch(event.getAction())
            {
            case MotionEvent.ACTION_DOWN:

                x1 = event.getX();
                y1 = event.getY();
                System.out.println("x1-- "+x1);
                System.out.println("y1-- "+y1);
                dx = x1 - y1 ;
                break ;

            case MotionEvent.ACTION_UP:

                x2 = event.getX();
                y2 = event.getY();
                System.out.println("x2-- "+x2);
                System.out.println("y2-- "+y2);
                dy = x2 - y2 ;

            }


             if(dx > 1)
                {
                    System.out.println(" clicked on right side ");

                }else 
                {
                    System.out.println(" clicked on left side ");

                }

            return false;
}