我有一个ListView
,每行有多个元素,如下所示:
list_element.xml :
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/global_container"
android:descendantFocusability="blocksDescendants"
android:layout_width="match_parent"
android:layout_height="match_parent">
<HorizontalScrollView
android:id="@+id/scrollview"
android:clickable="true"
android:focusable="false"
android:focusableInTouchMode="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none">
Fragment1.java
正在使包含listview的布局膨胀,该列表视图包含上述元素。
我需要能够捕获每个项目的点击事件,以便在单击项目时更改元素的颜色,并在单击其他项目时将其恢复为原始颜色,因为新项目会更改元素颜色,依此类推
这意味着我尝试在OnItemClickListener
内抓取Fragment1.java
:
if (rootView != null) {
myList = (ListView) rootView.findViewById(R.id.my_list);
}
ArrayList l = new ArrayList();
//Bogus list
for (int i=0; i<20; i++) {
l.add(new Object());
}
adapter = new MyListAdapter(l, getActivity());
myList.setAdapter(adapter);
final MyListAdapter ad = adapter;
myList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapter, View arg1, int position, long id) {
ad.setClickedPosition(position);
ad.notifyDataSetChanged();
}
});
但是(我假设)HorizontalScrollView
的所有Touch事件都在捕捉点击/触摸...事件,我没有得到任何回复。正如您所看到的,我尝试了android:descendantFocusability="blocksDescendants"
并且无法反复改变可聚焦性。
我还尝试在列表适配器中捕获不同的事件:
vi = inflater.inflate(R.layout.list_element, null, true);
vi.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.d("aaa", "aaa");
}
});
和/或
horizontalScroll = vi.findViewById(R.id.scrollview);
horizontalScroll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.d("aaa", "aaa");
}
});
这两个选项都没有任何结果。然后,我该如何捕获列表中项目的点击事件并保持能够使用HorizontalScrollView
?
答案 0 :(得分:4)
好的,我解决了以下问题:
为了能够点击列表项,需要完成这两件事。
首先:
机器人:descendantFocusability = “blocksDescendants”
需要出现在行元素布局的最顶层元素上。
第二
机器人:可点击= “假” 机器人:可聚焦=“假” 机器人:focusableInTouchMode = “假”
这三个属性需要出现在HorizontalScrollView上。
该解决方案的问题在于HorizontalScrollView本身不起作用,因此一旦检测到单击事件,您需要激活它。我是在适配器的getView()方法上完成的。
单击元素时,我将位置传递给适配器:
<强> fragment.java 强>
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapter, View arg1, int position, long id) {
//Private method inside the adapter
ad.setClickedPosition(position);
ad.notifyDataSetChanged();
}
});
<强> adapter.java 强>
public void setClickedPosition(int clickedPosition) {
this.clickedPosition = clickedPosition;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (clickedPosition == position)
holder.scrollview.setScrollingEnabled(true);
else
holder.scrollview.setScrollingEnabled(false);
}
<强> CustomHorizontalScrollview.java 强>
public void setScrollingEnabled (boolean enabled) {
this.isScrollEnabled = enabled;
}
//...
@Override
public boolean onTouchEvent(MotionEvent ev) {
//...
if (isScrollEnabled) {
return super.onTouchEvent(ev);
}
//...
}
需要考虑的是这个解决方案对我有用,因为“首次点击然后滑动”的行为就是我想要的,所以请注意这可能不是你想要的,但应该帮助你完成你的任务。那工作。
答案 1 :(得分:0)
尝试更改list_element.xml,如下所示:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/global_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<HorizontalScrollView
android:id="@+id/scrollview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none" />
</RelativeLayout>
希望这可以帮助你