- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 HorizontalScrollView 作为 ListView 的一个项目。每个 HorizontalScrollView 中都有可点击的图像。水平 ScrollView 也应该有特定的滚动行为。我已经为单个 HorizontalScrollView 实现了它。但是现在我需要制作这些 ScrollView 的列表,并且每个 ScrollView 都应该具有这种行为。我正在使用 ParseQueryAdapter,因为我从 parse.com 获取信息。当我尝试在每个项目上使用特定滚动代码时,只有最后一个项目有这种行为。而且它的效果也很糟糕。但也许这是我的错。请帮助我为每个项目设置 onTouchListener。以及每个项目中每个 ImageView 的 onClickListener。这是我的代码
public class CustomParseQueryAdapter extends ParseQueryAdapter<Lighter> {
Activity activity;
int rankNumber;
Bitmap bitmap;
int currentScrollViewPosition;
int middlePosition;
HorizontalScrollView itemScrollView;
RelativeLayout rankParentLayout;
RelativeLayout lighterNameAndMilesLayout;
GestureDetector gestureDetector;
public CustomParseQueryAdapter(Context context){
super(context, new QueryFactory<Lighter>() {
@Override
public ParseQuery<Lighter> create() {
ParseQuery<Lighter> query = new ParseQuery<>("Lighter");
query.orderByDescending("miles");
query.include("master");
return query;
}
});
activity = (Activity) context;
rankNumber = 1;
}
@Override
public View getItemView(Lighter lighter, View v, ViewGroup parent) {
if (v == null){
v = View.inflate(getContext(), R.layout.ranking_list_item, null);
}
super.getItemView(lighter, v, parent);
gestureDetector = new GestureDetector(new CustomGestureDetector());
itemScrollView = (HorizontalScrollView) v.findViewById(R.id.item_scroll_view);
LinearLayout itemParentLayout = (LinearLayout) v.findViewById(R.id.rank_item_linear_scroll_view);
RelativeLayout crossedCitiesParentLayout = (RelativeLayout) v.findViewById(R.id.item_crossed_cities_layout);
RelativeLayout timesCheckedParentLayout = (RelativeLayout) v.findViewById(R.id.item_times_checked_layout);
rankParentLayout = (RelativeLayout) v.findViewById(R.id.item_rank_layout);
lighterNameAndMilesLayout = (RelativeLayout) v.findViewById(R.id.item_lighter_name_and_miles_layout);
TextView crossedCitiesAmount = (TextView) v.findViewById(R.id.item_crossed_cities);
TextView timesCheckedAmount = (TextView) v.findViewById(R.id.item_times_checked);
TextView itemRankNumber = (TextView) v.findViewById(R.id.item_rank_number);
ImageView lighterImage = (ImageView) v.findViewById(R.id.item_lighter_image);
TextView lighterName = (TextView) v.findViewById(R.id.item_lighter_name);
TextView milesTravelled = (TextView) v.findViewById(R.id.item_lighter_miles_travelled);
// This userImage ImageView should have the onClickListener to start another fragment
ImageView userImage = (ImageView) v.findViewById(R.id.item_user_image);
String lighterColor = lighter.getColor();
itemParentLayout.setBackgroundColor(FragmentMap.getColor(lighterColor, activity.getResources()));
crossedCitiesParentLayout.setBackgroundColor(FragmentMap.getAnotherColor(lighterColor, activity.getResources()));
timesCheckedParentLayout.setBackgroundColor(FragmentMap.getAnotherColor(lighterColor, activity.getResources()));
rankParentLayout.setBackgroundColor(FragmentMap.getAnotherColor(lighterColor, activity.getResources()));
lighterNameAndMilesLayout.getLayoutParams().width = FragmentMap.getScreenSize(activity).x - FragmentMap.MARGIN;
crossedCitiesAmount.setText(lighter.getCitiesAmount() + " CITIES");
timesCheckedAmount.setText(lighter.getTimesChecked() + " TIMES");
itemRankNumber.setText(String.valueOf(rankNumber));
rankNumber++;
setUpLighterImage(lighterImage, lighterColor);
lighterName.setText(lighter.getLighterName().toUpperCase());
milesTravelled.setText(lighter.getIntMiles() + " MILES TRAVELLED");
final ParseUser lighterMasterUser = lighter.getParseUser("master");
final String userProfileID = lighterMasterUser.getString("profileID");
Thread thread = new Thread(new Runnable() {
public void run() {
bitmap = FragmentMap.getBitmap(userProfileID, activity);
}
});
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
userImage.setImageBitmap(FragmentMap.getBitmapWithTineCircle(bitmap, activity));
middlePosition = rankParentLayout.getBottom() - FragmentMap.MARGIN;
v.post(new Runnable() {
@Override
public void run() {
itemScrollView.scrollTo(middlePosition, 0);
currentScrollViewPosition = 0;
}
});
itemScrollView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) {
return true;
}
return false;
}
});
return v;
}
private void setUpLighterImage(ImageView view, String color){
switch (color){
case "red":
view.setImageResource(R.drawable.red);
break;
case "pink":
view.setImageResource(R.drawable.pink);
break;
case "green":
view.setImageResource(R.drawable.green);
break;
case "orange":
view.setImageResource(R.drawable.orange);
break;
case "yellow":
view.setImageResource(R.drawable.yellow);
break;
case "silver":
view.setImageResource(R.drawable.silver);
break;
// it is gold, but was light brown
case "gold":
view.setImageResource(R.drawable.gold);
break;
case "copper":
view.setImageResource(R.drawable.copper);
break;
}
}
class CustomGestureDetector extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
if (e1.getX() < e2.getX()) {
getScrollPosition("left");
} else {
getScrollPosition("right");
}
// mapTitleScrollView.smoothScrollTo(scrollPosition, 0);
return true;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY){
return true;
}
}
private void getScrollPosition(String direction){
switch (direction){
case "left":
if (currentScrollViewPosition == 1){ // if scrollview is in rightmost position move to center
toCenterPosition();
} else if (currentScrollViewPosition == 0){ // if scrollview is in center position move left
toLeftPosition();
}
break;
case "right":
if (currentScrollViewPosition == -1){ // if scrollview is in leftmost position move to center
toCenterPosition();
} else if (currentScrollViewPosition == 0){ // if scrollview is in center position move right
toRightPosition();
}
break;
}
}
private void toLeftPosition(){
currentScrollViewPosition = -1;
itemScrollView.fullScroll(HorizontalScrollView.FOCUS_LEFT);
}
private void toRightPosition(){
currentScrollViewPosition = 1;
itemScrollView.fullScroll(HorizontalScrollView.FOCUS_RIGHT);
}
private void toCenterPosition(){
currentScrollViewPosition = 0;
itemScrollView.smoothScrollTo(middlePosition, 0);
}
}
这是我的ListView fragment 代码
public class FragmentList extends ListFragment {
ApplicationInterface fragmentHolder;
CustomParseQueryAdapter mainAdapter;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
fragmentHolder = (ApplicationInterface) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString());
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_list, container, false);
mainAdapter = new CustomParseQueryAdapter(getActivity());
setListAdapter(mainAdapter);
return view;
}
}
和 ListView 的 XML:
<ListView
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
我还需要在 ListView 的整个项目上使用 onClickListener。但我认为它应该在我的FragmentList
类中实现
最佳答案
好的,如果有人对我的解决方案感兴趣,请看这里:我的手势检测器仅在 ListView 的最后一项上工作的原因是用于存储 HorizontalScrollView 的全局变量。我将它设为本地并将其作为参数传递给我的手势检测器。我还更改了 onFling 方法检测,因为它与 onClick 监听器有冲突。它抛出 NullPointerException,告诉我我正在尝试对空对象使用方法 MotionEvent.getX()。这就是我的代码现在的样子:
public class CustomParseQueryAdapter extends ParseQueryAdapter<Lighter> {
Activity activity;
int rankNumber;
Bitmap bitmap;
int currentScrollViewPosition;
ApplicationInterface fragmentHolder;
public CustomParseQueryAdapter(Context context, ApplicationInterface fragmentHolder){
super(context, new QueryFactory<Lighter>() {
@Override
public ParseQuery<Lighter> create() {
ParseQuery<Lighter> query = new ParseQuery<>("Lighter");
query.orderByDescending("miles");
query.include("master");
return query;
}
});
activity = (Activity) context;
rankNumber = 1;
this.fragmentHolder = fragmentHolder;
}
@Override
public View getItemView(final Lighter lighter, View v, ViewGroup parent) {
if (v == null){
v = View.inflate(getContext(), R.layout.ranking_list_item, null);
}
final HorizontalScrollView itemScrollView = (HorizontalScrollView) v.findViewById(R.id.item_scroll_view);
itemScrollView.setSmoothScrollingEnabled(true);
v.post(new Runnable() {
@Override
public void run() {
itemScrollView.fullScroll(View.FOCUS_RIGHT);
currentScrollViewPosition = 1;
}
});
LinearLayout itemParentLayout = (LinearLayout) v.findViewById(R.id.rank_item_linear_scroll_view);
RelativeLayout crossedCitiesParentLayout = (RelativeLayout) v.findViewById(R.id.item_crossed_cities_layout);
RelativeLayout timesCheckedParentLayout = (RelativeLayout) v.findViewById(R.id.item_times_checked_layout);
RelativeLayout rankParentLayout = (RelativeLayout) v.findViewById(R.id.item_rank_layout);
RelativeLayout lighterNameAndMilesLayout = (RelativeLayout) v.findViewById(R.id.item_lighter_name_and_miles_layout);
TextView crossedCitiesAmount = (TextView) v.findViewById(R.id.item_crossed_cities);
TextView timesCheckedAmount = (TextView) v.findViewById(R.id.item_times_checked);
TextView itemRankNumber = (TextView) v.findViewById(R.id.item_rank_number);
ImageView lighterImage = (ImageView) v.findViewById(R.id.item_lighter_image);
TextView lighterName = (TextView) v.findViewById(R.id.item_lighter_name);
TextView milesTravelled = (TextView) v.findViewById(R.id.item_lighter_miles_travelled);
ImageView userImage = (ImageView) v.findViewById(R.id.item_user_image);
final String lighterColor = lighter.getColor();
final String lighterObjectId = lighter.getObjectId();
itemParentLayout.setBackgroundColor(FragmentMap.getColor(lighterColor, activity.getResources()));
crossedCitiesParentLayout.setBackgroundColor(FragmentMap.getColor(lighterColor, activity.getResources()));
timesCheckedParentLayout.setBackgroundColor(FragmentMap.getAnotherColor(lighterColor, activity.getResources()));
rankParentLayout.setBackgroundColor(FragmentMap.getAnotherColor(lighterColor, activity.getResources()));
lighterNameAndMilesLayout.getLayoutParams().width = FragmentMap.getScreenSize(activity).x - FragmentMap.MARGIN;
crossedCitiesAmount.setText(lighter.getCitiesAmount() + " CITIES");
timesCheckedAmount.setText(lighter.getTimesChecked() + " TIMES");
itemRankNumber.setText("#" + String.valueOf(rankNumber));
rankNumber++;
setUpLighterImage(lighterImage, lighterColor);
lighterName.setText(lighter.getLighterName().toUpperCase());
milesTravelled.setText(lighter.getIntMiles() + " MILES TRAVELLED");
final ParseUser lighterMasterUser = lighter.getParseUser("master");
final String userProfileID = lighterMasterUser.getString("profileID");
Thread thread = new Thread(new Runnable() {
public void run() {
bitmap = FragmentMap.getBitmap(userProfileID, activity);
}
});
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
userImage.setImageBitmap(FragmentMap.getBitmapWithTineCircle(bitmap, activity));
final GestureDetector gestureDetector = new GestureDetector(
new CustomGestureDetector(currentScrollViewPosition, itemScrollView));
lighterNameAndMilesLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
fragmentHolder.onMapRedirect(lighterObjectId, lighterColor);
}
});
itemScrollView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
});
super.getItemView(lighter, v, parent);
return v;
}
private void setUpLighterImage(ImageView view, String color){
switch (color){
case "red":
view.setImageResource(R.drawable.red);
break;
case "pink":
view.setImageResource(R.drawable.pink);
break;
case "green":
view.setImageResource(R.drawable.green);
break;
case "orange":
view.setImageResource(R.drawable.orange);
break;
case "yellow":
view.setImageResource(R.drawable.yellow);
break;
case "silver":
view.setImageResource(R.drawable.silver);
break;
// it is gold, but was light brown
case "gold":
view.setImageResource(R.drawable.gold);
break;
case "copper":
view.setImageResource(R.drawable.copper);
break;
}
}
class CustomGestureDetector extends GestureDetector.SimpleOnGestureListener {
int currentScrollViewPosition;
HorizontalScrollView itemScrollView;
public CustomGestureDetector(int currentPosition, HorizontalScrollView scrollView){
currentScrollViewPosition = currentPosition;
itemScrollView = scrollView;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
if (velocityX > 0){
getScrollPosition("left");
} else {
getScrollPosition("right");
}
return true;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY){
if (distanceX < 0){
getScrollPosition("left");
} else {
getScrollPosition("right");
}
return true;
}
private void getScrollPosition(String direction){
switch (direction){
case "left":
if (currentScrollViewPosition == 1){
toLeftPosition();
} else if (currentScrollViewPosition == 0){
toLeftPosition();
}
break;
case "right":
if (currentScrollViewPosition == -1){
toRightPosition();
} else if (currentScrollViewPosition == 0){
toRightPosition();
}
break;
}
}
private void toLeftPosition(){
currentScrollViewPosition = -1;
itemScrollView.fullScroll(HorizontalScrollView.FOCUS_LEFT);
}
private void toRightPosition(){
currentScrollViewPosition = 1;
itemScrollView.fullScroll(HorizontalScrollView.FOCUS_RIGHT);
}
}
}
关于android - 为 ParseQuery Adapter 中的每个项目设置 Touchlistener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30060338/
这个问题已经有答案了: Is there any way to accept only numeric values in a JTextField? (20 个回答) It's possible i
我使用戴尔 XPS M1710。笔记本电脑的盖子、侧面扬声器和前置扬声器都有灯(3 组灯可以单独调节)和鼠标垫下方的灯。在 BIOS 中,我可以更改这些灯的颜色,至少是每个组。另外,我可以在鼠标垫下打
我知道我可以使用 在 iOS 5 中打开设置应用 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs://"
我有一个 Django 应用程序,我正在尝试为其设置文档。目录结构如下: - doc - project | - manage.py 我已经设置了路径以便 Sphinx 可以看到东西,但是当我尝试使用
我正在使用 768mb ram 运行 centos 5.5。我一直在日志中获取 server reached MaxClients setting, consider raising the MaxC
我在具有以下配置的服务器内运行了 Drupal 安装: StartServers 5 MinSpareServers 5 MaxSpareServers 15 MaxClien
是否可以使用 Microsoft.Web.Administration 包为给定的 location 配置 asp 设置? 我想以编程方式将以下部分添加到本地 IIS applicationHost.
我一直在阅读为 kube-proxy 提供参数的文档,但没有解释应该如何使用这些参数。我使用 az aks create 创建我的集群使用 azure-cli 程序,然后我获得凭据并使用 kubect
我想知道与在 PHP 中使用 setcookie() 函数相比,在客户端通过 JavaScript 设置一些 cookie 是否有任何明显的优势?我能想到的唯一原因是减少一些网络流量(第一次)。但不是
我有一个按钮可以将 body class 设置为 .blackout 我正在使用 js-cookie设置cookie,下面的代码与我的按钮相关联。 $('#boToggle').on('click'
我有一堆自定义的 HTML div。我将其中的 3 存储在具有 slide 类的 div 中。然后,我使用该幻灯片类调用 slick 函数并应用如下设置: $('.slide').slick({
我正在创建一个应该在 Windows 8(桌面)上运行的应用 我需要: 允许用户使用我的应用启动“文件历史记录”。我需要找到打开“文件历史记录”的命令行。 我需要能够显示“文件历史记录”的当前设置。
我刚买了一台新的 MacBook Pro,并尝试在系统中设置 RVM。我安装了 RVM 并将默认设置为 ➜ rvm list default Default Ruby (for new shells)
由于有关 Firestore 中时间戳行为即将发生变化的警告,我正在尝试更改我的应用的初始化代码。 The behavior for Date objects stored in Firestore
在 ICS 中,网络 -> 数据使用设置屏幕中现在有“限制后台数据”设置。 有没有办法以编程方式为我的应用程序设置“限制后台数据”? 或 有没有办法为我的应用程序调出具有选项的“数据使用”设置? 最佳
我正在尝试使用 NextJS 应用程序设置 Jest,目前在 jest.config.js : module.exports = { testPathIgnorePatterns: ["/.n
我最近升级到 FlashDevelop 4,这当然已经将我之前的所有设置恢复到原来的状态。 我遇到的问题是我无法在新设置窗口的哪个位置找到关闭它在方括号、大括号等之前插入的自动空格的选项。 即它会自动
有没有办法以编程方式访问 iPhone/iPod touch 设置? 谢谢。比兰奇 最佳答案 大多数用户设置可以通过读取存储在 /User/Library/Preferences/ 中的属性列表来访问
删除某些值时,我需要选择哪些设置来维护有序队列。我创建了带有自动增量和主键的 id 的表。当我第一次插入值时,没问题。就像 1,2,3,4,5... 当删除某些值时,顺序会发生变化,例如 1,5,3.
我正在尝试设置示例 Symfony2 项目,如此处所示 http://symfony.com/doc/current/quick_tour/the_big_picture.html 在访问 confi
我是一名优秀的程序员,十分优秀!