我有一个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)检查另一个事件的结果?
非常感谢你的帮助!
答案 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;
}