GVKun编程网logo

JSF 2.0:为什么即使仍在同一View上也要重新创建ViewScope Bean

11

在本文中,我们将带你了解JSF2.0:为什么即使仍在同一View上也要重新创建ViewScopeBean在这篇文章中,同时我们还将给您一些技巧,以帮助您实现更有效的AndroidScrollView嵌

在本文中,我们将带你了解JSF 2.0:为什么即使仍在同一View上也要重新创建ViewScope Bean在这篇文章中,同时我们还将给您一些技巧,以帮助您实现更有效的Android ScrollView 嵌套 listview /GridView/RecycleView 出现问题以及解决方法、android – 为什么在重新创建活动时不会在viewpager中重新创建片段?、android – 使用带有ImageViews和TextViews的GridView的问题、android – 如何在NestedScrollView中使用RecyclerView创建ViewPager

本文目录一览:

JSF 2.0:为什么即使仍在同一View上也要重新创建ViewScope Bean

JSF 2.0:为什么即使仍在同一View上也要重新创建ViewScope Bean

在我的.xhtml页面中,我具有以下形式:

<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
            template="./../template/CustomerTemplate.xhtml"
            xmlns:h="http://java.sun.com/jsf/html"
            xmlns:f="http://java.sun.com/jsf/core"
            xmlns:p="http://primefaces.prime.com.tr/ui">

    <ui:define name="formContent">
        <h:form> 
            <p:dataGrid var="item" value="#{mrBean.items}" columns="3">
                <p:column>
                    <p:panel header="#{item.name}">
                        <h:panelGrid columns="1">
                            ...
                            <h:commandButton value="Add To Cart" actionListener="#{cartBean.addItem(item.id)}" />
                            ...
                        </h:panelGrid>
                    </p:panel>
                </p:column>
            </p:dataGrid> 
        </h:form> 
    </ui:define>

</ui:composition>

CustomerTemplate.xhtml是:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.prime.com.tr/ui">
    <h:head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        ... // import css,js files
    </h:head>

    <h:body>
        ... // Other things on the page
        <div>
            <ui:insert name="contentTitle"></ui:insert>
            <ui:insert name="formContent"></ui:insert>
        </div>
        ...
    </h:body>
</html>

这是我的ManagedBean:

@ManagedBean
@ViewScoped
public class MrBean {
    ...
    private List<ItemState> items;
    ...

    @PostConstruct
    public void prepareItemList() {
        ...
        Map<String,String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
            partnerID = Long.parseLong(params.get("partnerID"));
        ...
    }
}

如您所见,我的MrBean是ViewScoped
ManagedBean。我希望@PostContruct函数只会在页面第1次呈现时被调用一次。但是,当我单击该Add To Cart按钮时,Long.parseLong(params.get("partnerID"))即使我仍在同一视图上,我也遇到了该行中的null异常。

如果有人能给我有关如何解决此问题的建议,我将不胜感激。

更新: 我设法通过包装标签commandButton内的功能使函数正常工作,ajax如下所示:

...
<f:ajax listener="#{cartManagedBean.addItem(item.id)}">
    <h:commandButton value="Add To Cart" /> 
</f:ajax>
....

Android ScrollView 嵌套 listview /GridView/RecycleView 出现问题以及解决方法

Android ScrollView 嵌套 listview /GridView/RecycleView 出现问题以及解决方法

ScrollView 嵌套 listview 会出现滑动事件冲突,以及显示不全的问题(只显示 第一行数据)

     1. 因为 scrollview 是可滑动控件 ,ListView 也是可滑动 控件 当两个控件嵌套使用的时候,Android 的机制并不知道 监听那一个控件的滑动。此时就会出现滑动事件的冲突

  解决方法:自定义 listview 重写 onMeasure () 方法

      protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec){

          int extendSpec=MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2,measureSpec.AT_MOST);

          super.onMeasure(widthMeasureSpec,extendSpec);

      }

MeasureSpec 中有三个属性可以设置分别为:

  AT_MOST: 设置最大尺寸 控件大小会随着控件子控件/内容空间变化变化 ,只要不超出 父容器允许的最大尺寸都可以

 EXACTLY :精确尺寸 ,子控件中设置的尺寸大小  控件 就会显示多大的尺寸

 UNSPECIFIED : 未指定尺寸大小

 重写此方法可解决 嵌套 listview /GridView 滑动冲突问题。

   但是此时 嵌套 listview 并未解决 listview 显示一行的问题

  此时需要重新计算 listview 的高度

   重写 onSizeChanged () 方法

    protected void onSizeChanged(int w,int h,int oldw,int oldh ){

super.onSizeChanged(w,h,oldw,oldh);

setListViewHeight(this);

}

 

private void setListViewHeight(ListView listView){

Adapter adpter=listView.getAdapter ():  // 获取当前 使用的适配器

if (adapter==null){// 进行非空判断

return;

}

int totalHeight=0;// 定义变量 用于保存当前 listview 的高度

int widthSpec=MeasureSpec.makeMeasureSpec(listview.getWidth,MeasureSpec.AT_MOST);

for (i =0; i<adapter.getCount(); i++){

View listItem=adapter.getView(i,null,listview);

if (listItem!=null){// 非空判断

listItem.measure(widthSpec,MeasureSpec.UNSPECIFIED);

totalHeight += listItem.getMeasuredHeight();

}

}

ViewGroup.LayoutParams params=listview.getLayoutParams();

  params.height=totalHeight+(listview.getDividerHeight()*(listview.getCount()-1));

listview.setLayoutParams(params);

listview.requestLayout ();// 对 listview 的属性 Params 设置完成之后 重新绘制 listview  

}

到此 就可以解决 scrollview 嵌套 listview 显示不全的问题

同样 还是会有一个 小问题 就是说 当 scrollview 嵌套 listview 时 由于机制的问题 会出现焦点 获取的问题

记忆中 可以使用如下两种方法 解决该问题

1. 在 ScrollView 子布局中 LinearLayout /RelativeLayout 中添加 focusable="true" ,focusInTouchMode="true", 这样相当于 把 焦点放到父容器当中 listview 就会显示到底一行 ,或者 ScrollView 的头布局

2. 使用 scrollView.scrollTo (0,0); 同样可以解决此问题

 

ScrollVIew 嵌套 RecycleView 出现滑动冲突

解决方法:

直接在 RecycleView 的外层添加一层布局 线性布局 或者想对布局 然后在 RecycleView 的父容器中添加属性

descendantFocusability="blockDescendants"

descendantFocusability 中包涵三个属性

1.blockDescendants 会覆盖子类控件 直接获取焦点

2.beforeDescendants 优先子类控件获取焦点

3.afterDescendants 只有当其子类控件不需要焦点时才获取焦点

android – 为什么在重新创建活动时不会在viewpager中重新创建片段?

android – 为什么在重新创建活动时不会在viewpager中重新创建片段?

在我的应用程序中,我正在使用带有tablayout的viewpager.当应用程序长时间处于后台时,将重新创建活动,但不会重新创建片段,因此来自服务的数据不会在UI上更新.

解决方法

将ui更新逻辑移动到onResume

@Override
public void onResume() {
    super.onResume();
    // call api for getting data
    // call ui processing method
}

android – 使用带有ImageViews和TextViews的GridView的问题

android – 使用带有ImageViews和TextViews的GridView的问题

我正在尝试在每个单元格中使用带有ImageView和TextView的GridView.所以我创建了单元格布局,网格布局,imageAdapter和主要活动,当然,但我不断遇到以下问题:

当我在模拟器上尝试这个时,初始图像和标题会正确显示,但是一旦我向下滚动,一些项目开始变得混乱并且不断变化甚至重复一些时间.

我正在使用2个并行阵列(图像和标题).我尝试使用Log.v函数来查找调用getView时显示的索引和图像,但只能正确分配初始的(可以看到没有滚动).

我通过一遍又一遍地生成视图来解决问题,但这显然不是正确的方法.

这是我正在使用的文件:

网格单元格:

ravity="center_horizontal">

   ravity="center_horizontal"
      android:textColor="#FFFFFF">
   

网格视图:

ImageAdapter:

public class ImageAdapter extends BaseAdapter {

    private Context mContext;
    private Integer[] mThumbIds = {R.drawable.potencia32x32,R.drawable.detalle_cuenta32x32,R.drawable.solicitud32x32,R.drawable.agregar32x32,R.drawable.cyr_32x32,R.drawable.usuarios,R.drawable.cambio_med64x64,R.drawable.cobranza_ex64x64,R.drawable.convenio_pagos64x64,R.drawable.copiabf64x64,R.drawable.info_cliente64x64,R.drawable.mant_exp64x64,R.drawable.ordenes64x64,R.drawable.reembolsos64x64,R.drawable.seguro64x64,R.drawable.solicitudes64x64,R.drawable.suministro64x64

    };
    private String[] Caption = {"Consumo","Facturaciones","Solicitudes","Pagos","Cortes y Rcnx","Datos Generales","Cambios de Medidores","Cobranza Externa","Convenio Pagos","copia Fac. o Bol.","Info. Cliente","Mant. Expediente","Consulta Ordenes","Historia Reembolsos","Seguros","Caracteristicas Suministro"

    };
    public ImageAdapter(Context c) {
        mContext = c;
    }

    public int getCount() {
        return mThumbIds.length;
    }

    public Object getItem(int position) {
        return null;
    }

    public long getItemId(int position) {
        return 0;
    }


    public View getView(int position,View convertView,ViewGroup parent) {


        View myView  = null;

        if(convertView==null)
        {
            LayoutInflater li = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            myView = li.inflate(R.layout.Grdmenu_cell,null);

            TextView tv = (TextView) myView.findViewById(R.id.grid_item_text);
            Log.v("D:<",String.valueOf(Caption.length) +" y: "+ String.valueOf(position));
            tv.setText(Caption[position]);


            ImageView iv = (ImageView) myView.findViewById(R.id.grid_item_image);
            Log.v("D:<",String.valueOf(mThumbIds.length) +" y: "+ String.valueOf(position));
            iv.setimageResource(mThumbIds[position]);
        }
        else
        {
            myView = convertView;
        }

        return myView;
    }

}

这是我的第一个问题,如果我犯了任何错误,请告诉我.提前致谢.

最佳答案
我认为错误发生在你的适配器的getView中. ConvertView不会保留通过findViewById()和其他方式访问的资源,只有膨胀的视图.尝试将其更改为以下内容:

public View getView(int position,ViewGroup parent) {


    View myView  = null;

    if(convertView==null)
    {
        LayoutInflater li = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        myView = li.inflate(R.layout.Grdmenu_cell,null);
    }else{
        myView = convertView;
    }


    TextView tv = (TextView) myView.findViewById(R.id.grid_item_text);
    Log.v("D:<",String.valueOf(Caption.length) +" y: "+ String.valueOf(position));
    tv.setText(Caption[position]);

    ImageView iv = (ImageView) myView.findViewById(R.id.grid_item_image);
    Log.v("D:<",String.valueOf(mThumbIds.length) +" y: "+ String.valueOf(position));
    iv.setimageResource(mThumbIds[position]);

    return myView;

}

android – 如何在NestedScrollView中使用RecyclerView创建ViewPager

android – 如何在NestedScrollView中使用RecyclerView创建ViewPager

我在ViewPager中使用nestedScrollView. nestedScrollView里面有一个LinearLayout,最后有一些TextViews,TabLayout和ViewPager. TextViews占据了大部分空间,并为ViewPager留下了一点空间. ViewPager使用两个片段,其中一个有几个TextViews和 ImageViews,另一个片段中有一个RecyclerView.

当我将ViewPager的高度设置为WRAP_CONTENT时,它只占用空间,我无法滚动查看第一个片段的其余部分,以及第二个片段scoll里面的小ViewPager.

例如,当我将ViewPager的高度设置为1000dp时,我可以向下滚动第一个片段,但第二个片段仍在小型ViewPager中滚动.在我用第一个Fragment中的RecyclerView scoll滚动片段后不再工作了.

如何修复滚动问题并使ViewPager与WRAP_CONTENT一起使用?

这是我的代码:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary" />

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.widget.nestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        app:layout_scrollFlags="scroll"
        android:fillViewport="true">

        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/mainBackground"
            android:orientation="vertical">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="SOME TEXT" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="SOME TEXT" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="SOME TEXT" />

            <android.support.design.widget.TabLayout
                android:id="@+id/tabLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

            <android.support.v4.view.ViewPager
                android:id="@+id/viewPager"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

        </LinearLayout>

    </android.support.v4.widget.nestedScrollView>

</android.support.design.widget.CoordinatorLayout>

解决方法

我认为你应该像这样覆盖ViewPager:
@Override
protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec,heightMeasureSpec);

    int height = 0;
    for (int i = 0; i < getChildCount(); i++) {
        View child = getChildAt(i);
        child.measure(widthMeasureSpec,MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED));
        int h = child.getMeasuredHeight();
        if (h > height) height = h;
    }
    heightMeasureSpec = MeasureSpec.makeMeasureSpec(height,MeasureSpec.EXACTLY);
    super.onMeasure(widthMeasureSpec,heightMeasureSpec);
}

关于JSF 2.0:为什么即使仍在同一View上也要重新创建ViewScope Bean的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于Android ScrollView 嵌套 listview /GridView/RecycleView 出现问题以及解决方法、android – 为什么在重新创建活动时不会在viewpager中重新创建片段?、android – 使用带有ImageViews和TextViews的GridView的问题、android – 如何在NestedScrollView中使用RecyclerView创建ViewPager等相关内容,可以在本站寻找。

本文标签: