1

Parse.com android SDK を使用しています。私TabsActivity.javaの の中には、 ListView にカスタム ParseQueryAdapter を設定するためにSearchFragment拡張する があります。ListFragmentカスタム アダプター内で、 というカスタム リスト行レイアウトを宣言しますsearch_list_item.xml。このレイアウトにはParseImageView.

私の問題は、リストをすばやく下にスクロールすると、logcat がいっぱいになることです。

I/dalvikvm-heap﹕ バイト割り当て用にヒープ (フラグメントの場合) を ...MB に拡張

listView は最初の位置に戻ります (つまり、最初の項目に戻ります)。一方、リストをゆっくりとスクロールすると、このエラーなしでアイテムの最後に到達できます。どうすればこれを修正できますか??

さらに、行をカスタマイズせずにデフォルトの ParseQueryAdapter を使用すると、search_list_item.xmlこのような問題は発生しません。

以下に、役立つと思われるコードをいくつか投稿します。

のコードsearch_list_item.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <com.parse.ParseImageView
        android:id="@+id/ProfileImage"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />



</RelativeLayout>

のコードTabsActivity.Java

public class TabsActivity extends Activity implements SearchFragment.OnFragmentInteractionListener, ActionBar.TabListener {

    /**
     * The {@link android.support.v4.view.PagerAdapter} that will provide
     * fragments for each of the sections. We use a
     * {@link FragmentPagerAdapter} derivative, which will keep every
     * loaded fragment in memory. If this becomes too memory intensive, it
     * may be best to switch to a
     * {@link android.support.v13.app.FragmentStatePagerAdapter}.
     */
    SectionsPagerAdapter mSectionsPagerAdapter;

    /**
     * The {@link ViewPager} that will host the section contents.
     */
    ViewPager mViewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tabs);

        // Set up the action bar.
        final ActionBar actionBar = getActionBar();
        actionBar.setLogo(R.drawable.logo_white);
        actionBar.setDisplayShowTitleEnabled(false);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        // Create the adapter that will return a fragment for each of the three
        // primary sections of the activity.
        mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager());

        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) findViewById(R.id.tabs_pager);
        mViewPager.setAdapter(mSectionsPagerAdapter);

        // When swiping between different sections, select the corresponding
        // tab. We can also use ActionBar.Tab#select() to do this if we have
        // a reference to the Tab.
        mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                actionBar.setSelectedNavigationItem(position);
            }
        });

        // For each of the sections in the app, add a tab to the action bar.

        actionBar.addTab(
                actionBar.newTab()
                        .setText("Search")
                        .setTabListener(this));

        actionBar.addTab(
                actionBar.newTab()
                        .setText("Secind")
                        .setTabListener(this));

        actionBar.addTab(
                actionBar.newTab()
                        .setText("Third")
                        .setTabListener(this)
        );

        actionBar.addTab(
                actionBar.newTab()
                        .setText("Fourth")
                        .setTabListener(this));


    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.tabs, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {

        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
        // When the given tab is selected, switch to the corresponding page in
        // the ViewPager.
        mViewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    }

    @Override
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    }

    /**
     * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
     * one of the sections/tabs/wizard1.
     */
    public class SectionsPagerAdapter extends FragmentPagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }


        @Override
        public Fragment getItem(int index) {

            switch (index) {
                case 0:
                    // Search fragment activity
              return new SearchFragment();
                case 1:
                    // Flirts fragment activity
                    return new SecondFragment();
                case 2:
                    // Explore fragment activity
                    return new ThirdFragment();
                case 3:
                    //Profile fragment activity
                    return new FourthFragment();
        }

        return null;
    }


        @Override
        public int getCount() {
            // Show 4 total wizard1.
            return 4;
        }

    }


    public void onFragmentInteraction(String id) {
        // The user selected the headline of an article from the HeadlinesFragment
        // Do something here to display that article
    }

}

のコードSearchFragment.java

public class SearchFragment extends ListFragment {

    private OnFragmentInteractionListener mListener;
    private CustomDogAdapter mainAdapter;

    /**
     * Mandatory empty constructor for the fragment manager to instantiate the
     * fragment (e.g. upon screen orientation changes).
     */
    public SearchFragment() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        mainAdapter = new CustomAdapter(this.getActivity());


        // Set the ListActivity's adapter to be the PQA
        mainAdapter.setAutoload(false);
        mainAdapter.loadObjects();
        setListAdapter(mainAdapter);


    }



    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (OnFragmentInteractionListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }


    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);

        if (null != mListener) {
            // Notify the active callbacks interface (the activity, if the
            // fragment is attached to one) that an item has been selected.
        }
    }

    /**
    * This interface must be implemented by activities that contain this
    * fragment to allow an interaction in this fragment to be communicated
    * to the activity and potentially other fragments contained in that
    * activity.
    * <p>
    * See the Android Training lesson <a href=
    * "http://developer.android.com/training/basics/fragments/communicating.html"
    * >Communicating with Other Fragments</a> for more information.
    */
    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        public void onFragmentInteraction(String id);
    }



}

のコードCustomAdapter.java

public class CustomAdapter extends ParseQueryAdapter<ParseObject> {

    public CustomAdapter(Context context) {
        // Use the QueryFactory to construct a PQA that will only show
        // Todos marked as high-pri
        super(context, new ParseQueryAdapter.QueryFactory<ParseObject>() {
            public ParseQuery create() {
                ParseQuery query = new ParseQuery("Photo");
                query.whereEqualTo("imageName", "profileImage");
//                query.setCachePolicy(ParseQuery.CachePolicy.CACHE_ELSE_NETWORK);
                return query;
            }
        });
    }

    // Customize the layout by overriding getItemView
    @Override
    public View getItemView(ParseObject object, View v, ViewGroup parent) {
        if (v == null) {
            v = View.inflate(getContext(), R.layout.search_list_item, null);
        }

        super.getItemView(object, v, parent);

        // Add and download the image
        ParseImageView image = (ParseImageView) v.findViewById(R.id.profileImage);
        ParseFile photoFile = object.getParseFile("imageFile");
        if (photoFile != null) {
            image.setParseFile(photoFile);
            image.loadInBackground();
//                    (new GetDataCallback() {
//                @Override
//                public void done(byte[] data, ParseException e) {
//                    // nothing to do
//                }
//            });

        }


//        // Add the title view
//        TextView titleTextView = (TextView) v.findViewById(R.id.text1);
//        titleTextView.setText(object.getString("title"));
//
//        // Add a reminder of how long this item has been outstanding
//        TextView timestampView = (TextView) v.findViewById(R.id.timestamp);
//        timestampView.setText(object.getCreatedAt().toString());
        return v;
    }

}

私は何度も勉強し、Parse.com のこれらのドキュメントに従いました。

1) UI-ParseQueryAdapter

2)ミールスポッティング

お時間を割いていただきありがとうございました。長い投稿で申し訳ありません。できるだけ説明するように努めました。

4

1 に答える 1