android-ViewPager(带TabHost)片段GetItem被多次调用

android-ViewPager(带TabHost)片段GetItem被多次调用,android,android-listview,android-viewpager,android-tabhost,android-arrayadapter,Android,Android Listview,Android Viewpager,Android Tabhost,Android Arrayadapter,我花了几个小时寻找一些关于我的具体问题的有用的帖子,但没有成功 所有的帖子都在谈论将列表视图布局设置为“填充父对象”。但我的布局中没有明确的列表视图 代码如下: TabsAdapter: public class TabsAdapter extends FragmentPagerAdapter implements TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener, IconPagerAdapter { . .

我花了几个小时寻找一些关于我的具体问题的有用的帖子,但没有成功

所有的帖子都在谈论将列表视图布局设置为“填充父对象”。但我的布局中没有明确的列表视图

代码如下:

TabsAdapter:

public class TabsAdapter extends FragmentPagerAdapter implements
    TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener, IconPagerAdapter {
.
.
     @Override
    public Fragment getItem(int position) {
        TabInfo info = mTabs.get(position);
        return Fragment.instantiate(mContext, info.clss.getName(),
            info.args);
    }
.
.
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View view = null;
    if (convertView == null) {
        LayoutInflater inflator = context.getLayoutInflater();
        view = inflator.inflate(
                R.layout.list_activity_segnalazioni_archivio_riga, null);
        final ViewHolder viewHolder = new ViewHolder();
        viewHolder.codiceEsterno = (TextView) view
                .findViewById(R.id.list_activity_segnalazione_archivio_riga_textview_codice_esterno);
        viewHolder.data = (TextView) view
                .findViewById(R.id.list_activity_segnalazione_archivio_riga_textview_data);
        viewHolder.posizione = (TextView) view
                .findViewById(R.id.list_activity_segnalazione_archivio_riga_textview_posizione);
        viewHolder.codiceEsterno.setFocusable(false);
        viewHolder.codiceEsterno.setFocusableInTouchMode(false);
        viewHolder.data.setFocusable(false);
        viewHolder.data.setFocusableInTouchMode(false);
        viewHolder.posizione.setFocusable(false);
        viewHolder.posizione.setFocusableInTouchMode(false);


        viewHolder.removeButton = (ImageButton) view.findViewById(R.id.list_activity_segnalazione_archivio_riga_imagebutton_remove);
        viewHolder.removeButton.setFocusable(false);
        viewHolder.removeButton.setFocusableInTouchMode(false);
        viewHolder.previewImage = (ImageView) view
                .findViewById(R.id.row_image);

            .
            .
            .
        view.setTag(viewHolder);
    } else {
        view = convertView;
    }

    ViewHolder holder = (ViewHolder) view.getTag();
    try {
        holder.codiceEsterno.setText(segnalazioni.get(position).getCodiceEsterno());
        holder.data.setText(DateUtils.formatToHumanDate(segnalazioni.get(
                position).getDataInizio()));

        String address = segnalazioni.get(position).getToponimo();
        if (segnalazioni.get(position).getCivico() != null
                && !segnalazioni.get(position).getCivico().equals("")) {
            address = address.concat(", ").concat(
                    segnalazioni.get(position).getCivico().toString()
                    .toUpperCase(Locale.ITALY));
        }
        holder.posizione.setText(address);

        Map<String, Object> sqlParams = new HashMap<String, Object>();
        sqlParams.put("identita", segnalazioni.get(position).getIdStorico());

            // This retrieve a base64 image from the sqlite.
            // Getting called more times that needed gives me an incredible cpu overhead
            **String thumb64 = SegnalamiApplication.abatis.executeForString("getAllFileDatiByIdEntitaForThumb", sqlParams);**

            if(thumb64 != null)
            {
                holder.previewImage.setImageBitmap(BitmapUtils.base64ToBitmap(thumb64));
            }

        } catch (NullPointerException e) {
            e.printStackTrace();
        }
        return view;
    }
<TabHost
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        <TabWidget
            android:id="@android:id/tabs"
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp" />

        <android.support.v4.view.ViewPager
            android:id="@+id/archivio_pager"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />

    </LinearLayout>
</TabHost>
阵列适配器:

public class TabsAdapter extends FragmentPagerAdapter implements
    TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener, IconPagerAdapter {
.
.
     @Override
    public Fragment getItem(int position) {
        TabInfo info = mTabs.get(position);
        return Fragment.instantiate(mContext, info.clss.getName(),
            info.args);
    }
.
.
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View view = null;
    if (convertView == null) {
        LayoutInflater inflator = context.getLayoutInflater();
        view = inflator.inflate(
                R.layout.list_activity_segnalazioni_archivio_riga, null);
        final ViewHolder viewHolder = new ViewHolder();
        viewHolder.codiceEsterno = (TextView) view
                .findViewById(R.id.list_activity_segnalazione_archivio_riga_textview_codice_esterno);
        viewHolder.data = (TextView) view
                .findViewById(R.id.list_activity_segnalazione_archivio_riga_textview_data);
        viewHolder.posizione = (TextView) view
                .findViewById(R.id.list_activity_segnalazione_archivio_riga_textview_posizione);
        viewHolder.codiceEsterno.setFocusable(false);
        viewHolder.codiceEsterno.setFocusableInTouchMode(false);
        viewHolder.data.setFocusable(false);
        viewHolder.data.setFocusableInTouchMode(false);
        viewHolder.posizione.setFocusable(false);
        viewHolder.posizione.setFocusableInTouchMode(false);


        viewHolder.removeButton = (ImageButton) view.findViewById(R.id.list_activity_segnalazione_archivio_riga_imagebutton_remove);
        viewHolder.removeButton.setFocusable(false);
        viewHolder.removeButton.setFocusableInTouchMode(false);
        viewHolder.previewImage = (ImageView) view
                .findViewById(R.id.row_image);

            .
            .
            .
        view.setTag(viewHolder);
    } else {
        view = convertView;
    }

    ViewHolder holder = (ViewHolder) view.getTag();
    try {
        holder.codiceEsterno.setText(segnalazioni.get(position).getCodiceEsterno());
        holder.data.setText(DateUtils.formatToHumanDate(segnalazioni.get(
                position).getDataInizio()));

        String address = segnalazioni.get(position).getToponimo();
        if (segnalazioni.get(position).getCivico() != null
                && !segnalazioni.get(position).getCivico().equals("")) {
            address = address.concat(", ").concat(
                    segnalazioni.get(position).getCivico().toString()
                    .toUpperCase(Locale.ITALY));
        }
        holder.posizione.setText(address);

        Map<String, Object> sqlParams = new HashMap<String, Object>();
        sqlParams.put("identita", segnalazioni.get(position).getIdStorico());

            // This retrieve a base64 image from the sqlite.
            // Getting called more times that needed gives me an incredible cpu overhead
            **String thumb64 = SegnalamiApplication.abatis.executeForString("getAllFileDatiByIdEntitaForThumb", sqlParams);**

            if(thumb64 != null)
            {
                holder.previewImage.setImageBitmap(BitmapUtils.base64ToBitmap(thumb64));
            }

        } catch (NullPointerException e) {
            e.printStackTrace();
        }
        return view;
    }
<TabHost
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        <TabWidget
            android:id="@android:id/tabs"
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp" />

        <android.support.v4.view.ViewPager
            android:id="@+id/archivio_pager"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />

    </LinearLayout>
</TabHost>
@覆盖
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视图=空;
if(convertView==null){
LayoutInflater充气器=上下文。getLayoutInflater();
视图=充气机。充气(
R.layout.list\u activity\u segnalazioni\u archivio\u riga,空);
最终ViewHolder ViewHolder=新的ViewHolder();
viewHolder.codicesterno=(TextView)视图
.findViewById(R.id.list\u activity\u segnalazione\u archivio\u riga\u textview\u codice\u esterno);
viewHolder.data=(TextView)视图
.findViewById(R.id.list\u activity\u segnalazione\u archivio\u riga\u textview\u data);
viewHolder.posizione=(TextView)视图
.findViewById(R.id.list\u activity\u segnalazione\u archivio\u riga\u textview\u posizione);
viewHolder.codicesterno.setFocusable(false);
viewHolder.codicesterno.setFocusableInTouchMode(false);
viewHolder.data.setFocusable(false);
viewHolder.data.setFocusableInTouchMode(false);
viewHolder.posizione.setFocusable(false);
viewHolder.posizione.setFocusableInTouchMode(false);
viewHolder.removeButton=(ImageButton)view.findViewById(R.id.list\u activity\u segnalazione\u archivio\u riga\u ImageButton\u remove);
viewHolder.removeButton.setFocusable(假);
viewHolder.removeButton.setFocusableInTouchMode(假);
viewHolder.previewImage=(图像视图)视图
.findViewById(R.id.row_图像);
.
.
.
view.setTag(viewHolder);
}否则{
视图=转换视图;
}
ViewHolder=(ViewHolder)view.getTag();
试一试{
holder.codicesterno.setText(segnalazioni.get(position.getcodicesterno());
holder.data.setText(DateUtils.formatToHumanDate(segnalazioni.get(
getDatanizio());
字符串地址=segnalazioni.get(position.getToponimo();
if(segnalazioni.get(position).getCivico()!=null
&&!segnalazioni.get(position.getCivico().equals(“”){
地址=地址.concat(“,”).concat(
segnalazioni.get(position.getCivico().toString())
.toUpperCase(地点:意大利));
}
holder.posizione.setText(地址);
Map sqlParams=newhashmap();
sqlParams.put(“identita”,segnalazioni.get(position.getIdStorico());
//这将从sqlite中检索base64映像。
//需要更多的呼叫次数会给我带来难以置信的cpu开销
**String thumb64=SegnalamiApplication.abatis.executeForString(“getAllFileDatiByIdEntitaForThumb”,sqlParams)**
如果(thumb64!=null)
{
holder.previewImage.setImageBitmap(BitmapUtils.base64ToBitmap(thumb64));
}
}捕获(NullPointerException e){
e、 printStackTrace();
}
返回视图;
}
xml布局(与其他GetItem帖子最重要的不同之处):

public class TabsAdapter extends FragmentPagerAdapter implements
    TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener, IconPagerAdapter {
.
.
     @Override
    public Fragment getItem(int position) {
        TabInfo info = mTabs.get(position);
        return Fragment.instantiate(mContext, info.clss.getName(),
            info.args);
    }
.
.
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View view = null;
    if (convertView == null) {
        LayoutInflater inflator = context.getLayoutInflater();
        view = inflator.inflate(
                R.layout.list_activity_segnalazioni_archivio_riga, null);
        final ViewHolder viewHolder = new ViewHolder();
        viewHolder.codiceEsterno = (TextView) view
                .findViewById(R.id.list_activity_segnalazione_archivio_riga_textview_codice_esterno);
        viewHolder.data = (TextView) view
                .findViewById(R.id.list_activity_segnalazione_archivio_riga_textview_data);
        viewHolder.posizione = (TextView) view
                .findViewById(R.id.list_activity_segnalazione_archivio_riga_textview_posizione);
        viewHolder.codiceEsterno.setFocusable(false);
        viewHolder.codiceEsterno.setFocusableInTouchMode(false);
        viewHolder.data.setFocusable(false);
        viewHolder.data.setFocusableInTouchMode(false);
        viewHolder.posizione.setFocusable(false);
        viewHolder.posizione.setFocusableInTouchMode(false);


        viewHolder.removeButton = (ImageButton) view.findViewById(R.id.list_activity_segnalazione_archivio_riga_imagebutton_remove);
        viewHolder.removeButton.setFocusable(false);
        viewHolder.removeButton.setFocusableInTouchMode(false);
        viewHolder.previewImage = (ImageView) view
                .findViewById(R.id.row_image);

            .
            .
            .
        view.setTag(viewHolder);
    } else {
        view = convertView;
    }

    ViewHolder holder = (ViewHolder) view.getTag();
    try {
        holder.codiceEsterno.setText(segnalazioni.get(position).getCodiceEsterno());
        holder.data.setText(DateUtils.formatToHumanDate(segnalazioni.get(
                position).getDataInizio()));

        String address = segnalazioni.get(position).getToponimo();
        if (segnalazioni.get(position).getCivico() != null
                && !segnalazioni.get(position).getCivico().equals("")) {
            address = address.concat(", ").concat(
                    segnalazioni.get(position).getCivico().toString()
                    .toUpperCase(Locale.ITALY));
        }
        holder.posizione.setText(address);

        Map<String, Object> sqlParams = new HashMap<String, Object>();
        sqlParams.put("identita", segnalazioni.get(position).getIdStorico());

            // This retrieve a base64 image from the sqlite.
            // Getting called more times that needed gives me an incredible cpu overhead
            **String thumb64 = SegnalamiApplication.abatis.executeForString("getAllFileDatiByIdEntitaForThumb", sqlParams);**

            if(thumb64 != null)
            {
                holder.previewImage.setImageBitmap(BitmapUtils.base64ToBitmap(thumb64));
            }

        } catch (NullPointerException e) {
            e.printStackTrace();
        }
        return view;
    }
<TabHost
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        <TabWidget
            android:id="@android:id/tabs"
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp" />

        <android.support.v4.view.ViewPager
            android:id="@+id/archivio_pager"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />

    </LinearLayout>
</TabHost>

在这一点上,每个项被调用5次,这给了我很高的开销和较少的元素(5项意味着25个GetItem调用)

我真诚地希望我们能一起解决这个问题


L.F.

代替
fragmentPagerAdapter
尝试
fragmentStatePagerAdapter