我有ViewPager
并在ViewPager
内部我使用适配器加载所有内容。不幸的是,我在这些内容中有Horizontal Listview
,当我尝试滑动Horizontal Listview
时整个ViewPager
正在滑动。那有什么解决方案吗?感谢您的期待。
这是我的ViewPager布局代码。
<com.devpoint.common.CustomViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:background="#e5e5e5"
android:layout_width="match_parent"
android:layout_height="match_parent" />
这是我的单一项目内部ViewPager
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fab="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#e5e5e5" >
<ScrollView
android:id="@+id/scrollviewid"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="5dp" >
<TableLayout
android:id="@+id/tableview"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<android.support.v7.widget.CardView
android:id="@+id/cardview"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="@dimen/liteam_fronmargin"
android:background="#e5e5e5"
android:clickable="true"
android:orientation="vertical"
android:padding="35dp"
android:tag="front"
card_view:cardCornerRadius="@dimen/liteam_cradius" >
<TableRow
android:layout_width="match_parent"
android:layout_height="150dp"
android:background="#e5e5e5"
android:gravity="center_horizontal"
android:orientation="horizontal" >
<com.devpoint.adapter.HorizontalListView
android:id="@+id/gridview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:columnWidth="60dp"
android:layout_gravity="center"
android:horizontalSpacing="10dp"
android:numColumns="3"
android:padding="10dp"
android:stretchMode="columnWidth"
android:verticalSpacing="10dp" />
</TableRow>
</android.support.v7.widget.CardView>
<!-- <android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="@dimen/liteam_fronmargin"
android:clickable="true"
android:orientation="vertical"
android:padding="35dp"
android:tag="front"
card_view:cardCornerRadius="@dimen/liteam_cradius" >
<TableRow
android:id="@+id/retailer_mobileno_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal"
android:padding="10dp" >
<fragment
android:id="@+id/map"
android:layout_width="@dimen/single_mapwidth"
android:layout_height="@dimen/single_mapheight"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
class="com.google.android.gms.maps.SupportMapFragment" />
</TableRow>
</android.support.v7.widget.CardView> -->
<TableRow
android:layout_width="match_parent"
android:layout_height="150dp"
android:background="#e5e5e5"
android:gravity="center_horizontal"
android:orientation="horizontal" >
<ImageView
android:id="@+id/btn_map"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:src="@drawable/map_location"
android:layout_weight="0.4"
android:layout_alignParentTop="true"
android:layout_marginTop="@dimen/userplace_btntop"/>
</TableRow>
</TableLayout>
</ScrollView>
</FrameLayout>
我的适配器看起来像这样
public ViewPagerAdapter(Context context, List<ListDetails> products,
android.app.FragmentManager fragmentManager) {
this.context = (Activity) context;
this.products = products;
// productNew =(CopyOnWriteArrayList<ListDetails>) products;
}
public void setPages(int x) {
this.pages = x;
}
@Override
public int getCount() {
pages = products.size();
return products.size();
}
public ListDetails getItem(int position) {
return products.get(position);
}
private class ViewHolder {
TextView txt_offer;
TextView txt_distance;
TextView txt_shop;
TableLayout tbldetails;
RatingBar rat_user;
ImageView viewdetails;
TextView txt_posteddate;
TextView txt_enddate;
TextView txt_category;
TextView txt_couponcode;
Button btnrating;
HorizontalListView swipelisview;
ScrollView scrollview;
CardView card;
ImageView map;
CirclePageIndicator mIndicator;
ViewPager viewPager;
FloatingActionButton btn_call;
FloatingActionButton btn_message;
FloatingActionButton btn_del;
FloatingActionButton btn_Mail;
FloatingActionButton btn_review;
FloatingActionButton btn_chat;
FloatingActionsMenu fmenu;
FloatingActionsMenu fmenu1;
}
@Override
public boolean isViewFromObject(View view, Object object) {
if (object != null) {
return ((FrameLayout) object) == view;
} else {
return false;
}
}
public int getItemPosition(Object object) {
return POSITION_NONE;
}
@SuppressLint("InflateParams")
@Override
public Object instantiateItem(final ViewGroup container, final int position) {
LayoutInflater li = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (itemView == null) {
if (alertLayout == null)
alertLayout = li.inflate(R.layout.map_dialog, null);
}
try {
// if(itemView == null)
// {
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
itemView = inflater.inflate(R.layout.single, container, false);
// }
} catch (InflateException e) {
e.printStackTrace();
}
try {
holder = new ViewHolder();
holder.txt_offer = (TextView) itemView
.findViewById(R.id.Offer_edittext);
holder.txt_distance = (TextView) itemView
.findViewById(R.id.distance_edittext);
holder.txt_shop = (TextView) itemView
.findViewById(R.id.Shop_edittext);
holder.tbldetails = (TableLayout) itemView
.findViewById(R.id.tablevielw);
holder.rat_user = (RatingBar) itemView
.findViewById(R.id.user_ratingbar);
holder.viewdetails = (ImageView) itemView
.findViewById(R.id.btn_details);
holder.txt_posteddate = (TextView) itemView
.findViewById(R.id.offerPosted_edittext);
holder.txt_enddate = (TextView) itemView
.findViewById(R.id.OfferEnd_edittext);
holder.txt_category = (TextView) itemView
.findViewById(R.id.category_edittext);
holder.txt_couponcode = (TextView) itemView
.findViewById(R.id.Coupon_edittext);
holder.btnrating = (Button) itemView.findViewById(R.id.btn_rating);
holder.swipelisview = (HorizontalListView) itemView
.findViewById(R.id.gridview);
// holder.swipelisview.setOnTouchListener(mSuppressInterceptListener);
holder.swipelisview.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//DetailsViewpagerFragment.viewPager.setEnabled(false);
DetailsViewpagerFragment.viewPager.setSwipeable(false);
DetailsViewpagerFragment.viewPager.setEnabled(false);
holder.scrollview.setEnabled(false);
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
//DetailsViewpagerFragment.viewPager.setEnabled(true);
DetailsViewpagerFragment.viewPager.setSwipeable(true);
holder.scrollview.setEnabled(true);
break;
}
return false;
}
});
((ViewPager) container).addView(itemView, 0);
// return itemView;
} catch (Exception e) {
// PostLogcatErorrs(e);
}
return itemView;
}
}
和我的主文件看起来像这样,我在这里呼叫Viewpager适配器
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
try {
try {
rootView = inflater.inflate(R.layout.details_viewpager_fragment, container, false);
//ViewPager mIndicator = (ViewPager) rootView.findViewById(R.id.pager);
GetOfferShopList();
} catch (InflateException e) {
PostLogcatErorrs(e);
}
} catch (Exception e) {
Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_LONG)
.show();
e.printStackTrace();
PostLogcatErorrs(e);
}
return rootView;
}
private void GetOfferShopList() {
try {
final Location CurrentLocation = new Location(
getString(R.string.point_A));
CurrentLocation.setLatitude(latitude);
CurrentLocation.setLongitude(longitude);
ListItemsData = new CopyOnWriteArrayList<ListDetails>();
// Creating volley request obj
JsonObjectRequest movieReq = new JsonObjectRequest(LoadActivity.BaseUri + "GetAllOffer?type=",
null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
//Log.d(TAG, response.toString());
JSONArray GetMG_AppointmentRequestResult = null;
try {
GetMG_AppointmentRequestResult = response.getJSONArray(getString(R.string.Json_offerresult));
} catch (JSONException e1) {
Toast.makeText(getActivity(),
e1.getMessage(), Toast.LENGTH_LONG).show();
e1.printStackTrace();
}
// Parsing json
for (int i = 0; i < GetMG_AppointmentRequestResult.length(); i++) {
try {
JSONObject obj = GetMG_AppointmentRequestResult.getJSONObject(i);
ListDetails ListModelObj = new ListDetails();
Location RetailerLocation = new Location(getString(R.string.point_B));
RetailerLocation.setLatitude(Double.parseDouble(obj
.getString( getString(R.string.Rlocaion_Lat))));
RetailerLocation.setLongitude(Double.parseDouble(obj
.getString( getString(R.string.Rlocaion_Lng))));
float distance = CurrentLocation.distanceTo(RetailerLocation)/1000;
float val = (float)Math.round(distance * 10) / 10;
ListModelObj.setDistance(val);
ListModelObj.setPosition_id(Integer.parseInt(obj.getString(getString(R.string.Shop_RegID))));
ListModelObj.setShopName(obj.getString(getString(R.string.Shop_Name)));
ListModelObj.setDescription(obj.getString(getString(R.string.Offer_Name)));
ListModelObj.setLat(Double.parseDouble(obj.getString( getString(R.string.Rlocaion_Lat))));
ListModelObj.setLng(Double.parseDouble(obj.getString( getString(R.string.Rlocaion_Lng))));
ListModelObj.setDeal(obj.getString(getString(R.string.retailer_deal)));
ListModelObj.setPromoCode(obj.getString(getString(R.string.promo_code)));
ListModelObj.setAreaName(obj.getString(getString(R.string.Area_Name)));
ListModelObj.setOfferStatus(obj.getString( getString(R.string.Offer_Status)));
ListModelObj.setCategoryName(obj.getString( getString(R.string.Category_Type)));
ListModelObj.setPostedDate(obj
.getString( getString(R.string.Offer_StartDate)));
ListModelObj.setOfferEndTime(obj
.getString( getString(R.string.Offer_EndTime)));
ListModelObj.setOfferEndDate(obj
.getString( getString(R.string.Offer_EndDate)));
ListModelObj.setOfferID(obj
.getString(getString(R.string.Offer_id)));
ListModelObj.setImageName1(obj.getString(getString(R.string.single_ImageName)));
String abc = obj.getString(getString(R.string.single_ImageName));
String[] xyz = abc.split(",");
ListModelObj.setListImage(LoadActivity.BaseUriImg
+ xyz[0]);
JSONObject aaa = obj.getJSONObject("result1");
//ListModelObj.setJSONData(aaa.getJSONArray("GetAllOfferResult"));
ListItemsData1 = new CopyOnWriteArrayList<ListDetails>();
// Parsing json
for (int i1 = 0; i1 < aaa.getJSONArray("GetAllOfferResult").length(); i1++) {
try {
JSONObject obj1 = aaa.getJSONArray("GetAllOfferResult").getJSONObject(i1);
ListDetails ListModelObj1 = new ListDetails();
Location RetailerLocation1 = new Location(getString(R.string.point_B));
RetailerLocation.setLatitude(Double.parseDouble(obj1
.getString( getString(R.string.Rlocaion_Lat))));
RetailerLocation.setLongitude(Double.parseDouble(obj1
.getString( getString(R.string.Rlocaion_Lng))));
float distance1 = CurrentLocation.distanceTo(RetailerLocation)/1000;
float val1 = (float)Math.round(distance * 10) / 10;
ListModelObj1.setDistance(val);
ListModelObj1.setPosition_id(Integer.parseInt(obj1.getString(getString(R.string.Shop_RegID))));
ListModelObj1.setShopName(obj1.getString(getString(R.string.Shop_Name)));
ListModelObj1.setDescription(obj1.getString(getString(R.string.Offer_Name)));
ListModelObj1.setLat(Double.parseDouble(obj1.getString( getString(R.string.Rlocaion_Lat))));
ListModelObj1.setLng(Double.parseDouble(obj1.getString( getString(R.string.Rlocaion_Lng))));
ListModelObj1.setDeal(obj1.getString(getString(R.string.retailer_deal)));
ListModelObj1.setPromoCode(obj1.getString(getString(R.string.promo_code)));
ListModelObj1.setAreaName(obj1.getString(getString(R.string.Area_Name)));
ListModelObj1.setOfferStatus(obj1.getString( getString(R.string.Offer_Status)));
ListModelObj1.setCategoryName(obj1.getString( getString(R.string.Category_Type)));
ListModelObj1.setPostedDate(obj1
.getString( getString(R.string.Offer_StartDate)));
ListModelObj1.setOfferEndTime(obj1
.getString( getString(R.string.Offer_EndTime)));
ListModelObj1.setOfferEndDate(obj1
.getString( getString(R.string.Offer_EndDate)));
ListModelObj1.setOfferID(obj1
.getString(getString(R.string.Offer_id)));
ListModelObj1.setImageName1(obj1.getString(getString(R.string.single_ImageName)));
String abc1 = obj1.getString(getString(R.string.single_ImageName));
String[] xyz1 = abc1.split(",");
ListModelObj1.setListImage(LoadActivity.BaseUriImg
+ xyz1[0]);
ListItemsData1.add(ListModelObj1);
} catch (JSONException e) {
Toast.makeText(getActivity(),
e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
ListModelObj.setJSONData(ListItemsData1);
ListModelObj.setViewPage_id(i);
ListItemsData.add(ListModelObj);
} catch (JSONException e) {
Toast.makeText(getActivity(),
e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
PostLogcatErorrs(e);
}
}
viewPager = (CustomViewPager) rootView.findViewById(R.id.pager);
viewPager.setCurrentItem(0);
adapter = new ViewPagerAdapter(getActivity(), ListItemsData , getActivity().getFragmentManager());
// Binds the Adapter to the ViewPager
viewPager.setAdapter(adapter);
//adapter.notifyDataSetChanged();
viewPager.setCurrentItem(ClickListID);
viewPager.setOffscreenPageLimit(3);
//adapter.notifyDataSetChanged();
//viewPager.setOffscreenPageLimit(3);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
AppController.getInstance().addToRequestQueue(movieReq);
} catch (Exception e) {
Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_LONG)
.show();
e.printStackTrace();
PostLogcatErorrs(e);
}
}
}
答案 0 :(得分:1)
尝试以下代码:当Horizontal Listview
中有移动事件时,请调用requestDisallowInterceptTouchEvent(true)
禁止拦截来自ViewPager
的触摸事件,当UP事件发生时,只需将其设置为false。请参阅Official Document
holder.swipelisview.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
view.getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
view.getParent().requestDisallowInterceptTouchEvent(false);
break;
}
return false;
}
});
或许您可以扩展ViewPager
,并覆盖onInterceptTouchEvent(MotionEvent pEvent)
方法以决定是否拦截所有触摸屏动作事件。请参阅Official Document。
答案 1 :(得分:1)
这是nonSwipeable viewpager的代码...希望它能为你效果
public class NonSwipeableViewPager extends ViewPager {
public NonSwipeableViewPager(Context context) {
super(context);
}
public NonSwipeableViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
// Never allow swiping to switch between pages
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// Never allow swiping to switch between pages
return false;
}
}