解决:重复在后台滚动列表视图 [英] SOLVED: Duplicates in the background while scrolling List View

查看:115
本文介绍了解决:重复在后台滚动列表视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是自定义列表视图和运行程序后,一切工作正常,但在滚动列表中,视图变得混乱。我贴的屏幕截图,其次是低于code。

我该如何解决这个问题?

初始屏幕:

之后,虽然滚动:

MyList.java:

 进口的java.util.ArrayList;进口android.content.Context;
进口android.graphics.Typeface;
进口android.media.MediaPlayer;
进口android.os.Bundle;
进口android.support.v4.app.Fragment;
进口android.view.LayoutInflater;
进口android.view.View;
进口android.view.ViewGroup;
进口android.widget.AdapterView;
进口android.widget.AdapterView.OnItemClickListener;
进口android.widget.BaseAdapter;
进口android.widget.ImageView;
进口android.widget.ListView;
进口android.widget.TextView;公共类MYLIST扩展片段{    ListView控件列表;
    MediaPlayer的熔点;    @覆盖
    公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,捆绑savedinstanceState)
    {
        熔点= MediaPlayer.create(getActivity(),R.raw.wave1);        返回inflater.inflate(R.layout.mylistview,集装箱,FALSE);    }    @覆盖
    公共无效调用onStart(){        super.onStart();
        名单=(ListView控件)getView()findViewById(R.id.listView1)。
        list.setAdapter(新MyListAdapter(getActivity()));
        list.setOnItemClickListener(新OnItemClickListener(){            @覆盖
            公共无效onItemClick(适配器视图<>为arg0,ARG1查看,INT位置,
                    长ARG3)
            {
                开关(位置)
                    {
                    情况下0:
                        mp.release();
                        熔点= MediaPlayer.create(getActivity(),R.raw.wave1);
                        mp.start();                    打破;                    情况1:
                        mp.release();
                        熔点= MediaPlayer.create(getActivity(),R.raw.wave2);
                        mp.start();
                        打破;                    案例2:
                        mp.release();
                        熔点= MediaPlayer.create(getActivity(),R.raw.wave3);
                        mp.start();
                        打破;                    案例3:
                        mp.release();
                        熔点= MediaPlayer.create(getActivity(),R.raw.wave4);
                        mp.start();
                        打破;                    情况4:
                        mp.release();
                        熔点= MediaPlayer.create(getActivity(),R.raw.wave5);
                        mp.start();
                        打破;
                    }             }
            });
    }
}    类MyListAdapter扩展了BaseAdapter
    {
        ArrayList的< SingleRow>清单;
        上下文语境;
        MyListAdapter(上下文C)
        {
            上下文= C;
            名单=新的ArrayList< SingleRow>();        //资源解析度= c.getResources();
        //的String [] =文字res.getStringArray(R.array.text);            INT [] =图像{R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                        };
            的for(int i = 0;我所述19;我++)
            {
                list.add(新SingleRow(图片由[i]));
            }
        }        @覆盖
        公众诠释的getCount(){
            // TODO自动生成方法存根
            返回则为list.size();
        }        @覆盖
        公共对象的getItem(INT位置){
            // TODO自动生成方法存根
            返回list.get(位置);
        }        @覆盖
        众长getItemId(INT位置){            返回的位置;
        }        @覆盖
        公共查看getView(INT位置,查看convertView,父母的ViewGroup){
            LayoutInflater吹气=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            查看ROW1 = inflater.inflate(R.layout.mylist_rows,父母,假);
            TextView的文本=(TextView的)row1.findViewById(R.id.textView1);
            ImageView的图像=(ImageView的)row1.findViewById(R.id.imageView1);            SingleRow TEMP = list.get(位置);            text.setText(temp.description);
            image.setImageResource(temp.image);            字体字型= Typeface.createFromAsset(text.getContext()getAssets(),字体/ OpenSans.ttf);            text.setTypeface(字体);            返回ROW1;
        }
    类SingleRow
    {
        字符串描述;
        INT形象;
        SingleRow(INT图)
        {
            //this.description=description;
            this.image =图像;
        }
    }    }

MainActivity.java:

 进口的java.util.ArrayList;进口android.content.res.Configuration;
进口android.content.res.TypedArray;
进口android.os.Bundle;
进口android.support.v4.app.ActionBarDrawerToggle;
进口android.support.v4.app.Fragment;
进口android.support.v4.app.FragmentActivity;
进口android.support.v4.widget.DrawerLayout;
进口android.view.Menu;
进口android.view.MenuItem;
进口android.view.View;
进口android.widget.AdapterView;
进口android.widget.ListView;公共类MainActivity扩展FragmentActivity {
    私人DrawerLayout mDrawerLayout;
    私人的ListView mDrawerList;
    私人ActionBarDrawerToggle mDrawerToggle;    //导航抽屉称号
    私人CharSequence的mDrawerTitle;    //用于存储应用程序标题
    私人CharSequence的mTitle;    //滑动菜单项
    私有String [] navMenuTitles;
    私人TypedArray navMenuIcons;    私人的ArrayList< NavDrawerItem> navDrawerItems;
    私人NavDrawerListAdapter适配器;    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);        mTitle = mDrawerTitle =的getTitle();        //负荷滑动菜单项
        navMenuTitles = getResources()getStringArray(R.array.nav_drawer_items)。        从资源//导航抽屉图标
        navMenuIcons = getResources()
                .obtainTypedArray(R.array.nav_drawer_icons);        mDrawerLayout =(DrawerLayout)findViewById(R.id.drawer_layout);
        mDrawerList =(ListView控件)findViewById(R.id.list_slidermenu);        navDrawerItems =新的ArrayList< NavDrawerItem>();        //添加导航抽屉里的物品数组
        //首页
        navDrawerItems.add(新NavDrawerItem(navMenuTitles [0],navMenuIcons.getResourceId(0,-1)));
        //找人
        navDrawerItems.add(新NavDrawerItem(navMenuTitles [1],navMenuIcons.getResourceId(1,-1)));
        //照片
        navDrawerItems.add(新NavDrawerItem(navMenuTitles [2],navMenuIcons.getResourceId(2,-1)));
        //社区,这里将添加计数器
        navDrawerItems.add(新NavDrawerItem(navMenuTitles [3],navMenuIcons.getResourceId(3,-1),真的,22));
        //网页
        navDrawerItems.add(新NavDrawerItem(navMenuTitles [4],navMenuIcons.getResourceId(4,-1)));
        //什么是热的,我们将在这里添加计数器
        navDrawerItems.add(新NavDrawerItem(navMenuTitles [5],navMenuIcons.getResourceId(5,-1),真的,50+));
        //回收类型数组
        navMenuIcons.recycle();        mDrawerList.setOnItemClickListener(新SlideMenuClickListener());        //设置导航抽屉名单适配器
        适配器=新NavDrawerListAdapter(getApplicationContext()
                navDrawerItems);
        mDrawerList.setAdapter(适配器);        //使操作栏中的应用程序图标和行为作为切换按钮
        getActionBar()setDisplayHomeAsUpEnabled(真)。
        getActionBar()setHomeButtonEnabled(真)。        mDrawerToggle =新ActionBarDrawerToggle(这一点,mDrawerLayout,
                R.drawable.ic_navigation_drawer,//导航菜单切换图标
                R.string.app_name,//导航抽屉打开 - 描述的可访问性
                R.string.app_name //导航抽屉接近 - 描述的可访问性
        ){
            公共无效onDrawerClosed(查看视图){
                。getActionBar()的setTitle(mTitle);
                //调用prepareOptionsMenu()来显示操作栏图标
                invalidateOptionsMenu();
            }            公共无效onDrawerOpened(查看drawerView){
                。getActionBar()的setTitle(mDrawerTitle);
                //调用prepareOptionsMenu()隐藏操作栏图标
                invalidateOptionsMenu();
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);        如果(savedInstanceState == NULL){
            //对第一个项目的资产净值首次显示视图
            displayView(0);
        }
    }    / **
     *滑动菜单项,点击监听器
     * * /
    私有类SlideMenuClickListener工具
            ListView.OnItemClickListener {
        @覆盖
        公共无效onItemClick(适配器视图<>母公司,观景,INT位置,
                长ID){
            //选定导航抽屉项显示视图
            displayView(位置);
        }
    }    @覆盖
    公共布尔onCreateOptionsMenu(菜单菜单){
        。getMenuInflater()膨胀(R.menu.main,菜单);
        返回true;
    }    @覆盖
    公共布尔onOptionsItemSelected(菜单项项){
        //切换上选择操作栏中的应用程序图标/标题导航抽屉
        如果(mDrawerToggle.onOptionsItemSelected(项目)){
            返回true;
        }
        //处理操作栏中点击动作
        开关(item.getItemId()){
        案例R.id.action_settings:
            返回true;
        默认:
            返回super.onOptionsItemSelected(项目);
        }
    }    / ***
     *时调用invalidateOptionsMenu()被触发
     * /
    @覆盖
    prepareOptionsMenu(菜单菜单)上公共布尔{
        //如果导航抽屉被打开,隐藏行动项目
        布尔drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
        menu.findItem(R.id.action_settings).setVisible(drawerOpen!);
        返回super.on prepareOptionsMenu(菜单);
    }    / **
     所选导航抽屉列表项* Diplaying片段视图
     * * /
    私人无效displayView(INT位置){        片段片段= NULL;
        //更新替换片段的主要内容
        开关(位置){
        情况下0:
            片段=新MYLIST();
            打破;        }        如果(片段!= NULL){
        android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
        .replace(R.id.frame_container,片段).commit();        mDrawerList.setItemChecked(位置,真正的);
        mDrawerList.setSelection(位置);
        (navMenuTitles [位置])的setTitle;
        mDrawerLayout.closeDrawer(mDrawerList);
        }    }    @覆盖
    公共无效的setTitle(CharSequence的标题){
        mTitle =称号;
        。getActionBar()的setTitle(mTitle);
    }    / **
     *当使用ActionBarDrawerToggle,你必须在调用它
     * onPostCreate()和onConfigurationChanged()...
     * /    @覆盖
    保护无效onPostCreate(捆绑savedInstanceState){
        super.onPostCreate(savedInstanceState);
        //同步onRestoreInstanceState后切换状态已经发生。
        mDrawerToggle.syncState();
    }    @覆盖
    公共无效onConfigurationChanged(配置NEWCONFIG){
        super.onConfigurationChanged(NEWCONFIG);
        //把任何配置更改抽屉toggls
        mDrawerToggle.onConfigurationChanged(NEWCONFIG);
    }}


解决方案

解决。原来我有片段的两个声明。一个 的activitymain.xml标记内声明和片段交易在MainActivity.java。据 http://developer.android.com/guide/components/fragments.html 您可以在其中任何声明片段,但不能同时使用。这就是为什么我得到双重的看法。

I'm using a custom list view and after running the application, everything works fine, but while scrolling the list, the view becomes messy. I've pasted screen shots, followed by the code below.

How can I fix this?

Initial screen:

After and while scrolling:

MyList.java:

import java.util.ArrayList;

import android.content.Context;
import android.graphics.Typeface;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class MyList extends Fragment {

    ListView list;
    MediaPlayer mp;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedinstanceState)
    {
        mp=MediaPlayer.create(getActivity(), R.raw.wave1);

        return inflater.inflate(R.layout.mylistview, container, false);

    }

    @Override
    public void onStart() {

        super.onStart();
        list=(ListView)getView().findViewById(R.id.listView1);
        list.setAdapter(new MyListAdapter(getActivity()));


        list.setOnItemClickListener(new OnItemClickListener(){

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                    long arg3) 
            {
                switch(position)
                    {
                    case 0:
                        mp.release();
                        mp=MediaPlayer.create(getActivity(), R.raw.wave1);
                        mp.start(); 

                    break;

                    case 1:
                        mp.release();
                        mp=MediaPlayer.create(getActivity(), R.raw.wave2);
                        mp.start(); 
                        break;

                    case 2:
                        mp.release();
                        mp=MediaPlayer.create(getActivity(), R.raw.wave3);
                        mp.start();     
                        break;

                    case 3:
                        mp.release();
                        mp=MediaPlayer.create(getActivity(), R.raw.wave4);
                        mp.start(); 
                        break;

                    case 4:
                        mp.release();
                        mp=MediaPlayer.create(getActivity(), R.raw.wave5);
                        mp.start(); 
                        break;
                    }

             }
            });
    }
}

    class MyListAdapter extends BaseAdapter
    {
        ArrayList<SingleRow> list;
        Context context;
        MyListAdapter(Context c)
        {
            context=c;
            list=new ArrayList<SingleRow>();

        //  Resources res=c.getResources();
        //  String[] text=res.getStringArray(R.array.text);

            int[] images={R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                    R.drawable.ic_launcher,
                        };
            for(int i=0;i<19;i++)
            {
                list.add(new SingleRow(images[i]));
            }
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return list.size();
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return list.get(position);
        }

        @Override
        public long getItemId(int position) {

            return position;
        }

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


            LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View row1=inflater.inflate(R.layout.mylist_rows, parent, false);
            TextView text=(TextView)row1.findViewById(R.id.textView1);
            ImageView image=(ImageView)row1.findViewById(R.id.imageView1);

            SingleRow temp=list.get(position);

            text.setText(temp.description);
            image.setImageResource(temp.image);

            Typeface font = Typeface.createFromAsset(text.getContext().getAssets(), "fonts/OpenSans.ttf");

            text.setTypeface(font);

            return row1;
        }


    class SingleRow
    {
        String description;
        int image;
        SingleRow( int image)
        {
            //this.description=description;
            this.image=image;
        }
    }

    }

MainActivity.java :

import java.util.ArrayList;

import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.widget.DrawerLayout;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

public class MainActivity extends FragmentActivity {
    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ActionBarDrawerToggle mDrawerToggle;

    // nav drawer title
    private CharSequence mDrawerTitle;

    // used to store app title
    private CharSequence mTitle;

    // slide menu items
    private String[] navMenuTitles;
    private TypedArray navMenuIcons;

    private ArrayList<NavDrawerItem> navDrawerItems;
    private NavDrawerListAdapter adapter;

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

        mTitle = mDrawerTitle = getTitle();

        // load slide menu items
        navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);

        // nav drawer icons from resources
        navMenuIcons = getResources()
                .obtainTypedArray(R.array.nav_drawer_icons);

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.list_slidermenu);

        navDrawerItems = new ArrayList<NavDrawerItem>();

        // adding nav drawer items to array
        // Home
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1)));
        // Find People
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1)));
        // Photos
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1)));
        // Communities, Will add a counter here
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1), true, "22"));
        // Pages
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons.getResourceId(4, -1)));
        // What's hot, We  will add a counter here
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1), true, "50+"));


        // Recycle the typed array
        navMenuIcons.recycle();

        mDrawerList.setOnItemClickListener(new SlideMenuClickListener());

        // setting the nav drawer list adapter
        adapter = new NavDrawerListAdapter(getApplicationContext(),
                navDrawerItems);
        mDrawerList.setAdapter(adapter);

        // enabling action bar app icon and behaving it as toggle button
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.ic_navigation_drawer, //nav menu toggle icon
                R.string.app_name, // nav drawer open - description for accessibility
                R.string.app_name // nav drawer close - description for accessibility
        ) {
            public void onDrawerClosed(View view) {
                getActionBar().setTitle(mTitle);
                // calling onPrepareOptionsMenu() to show action bar icons
                invalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(mDrawerTitle);
                // calling onPrepareOptionsMenu() to hide action bar icons
                invalidateOptionsMenu();
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        if (savedInstanceState == null) {
            // on first time display view for first nav item
            displayView(0);
        }
    }

    /**
     * Slide menu item click listener
     * */
    private class SlideMenuClickListener implements
            ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            // display view for selected nav drawer item
            displayView(position);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // toggle nav drawer on selecting action bar app icon/title
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        // Handle action bar actions click
        switch (item.getItemId()) {
        case R.id.action_settings:
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

    /***
     * Called when invalidateOptionsMenu() is triggered
     */
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        // if nav drawer is opened, hide the action items
        boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
        menu.findItem(R.id.action_settings).setVisible(!drawerOpen);
        return super.onPrepareOptionsMenu(menu);
    }

    /**
     * Diplaying fragment view for selected nav drawer list item
     * */
    private void displayView(int position) {

        Fragment fragment = null;
        // update the main content by replacing fragments
        switch (position) {
        case 0:
            fragment = new MyList();
            break;  

        } 

        if (fragment != null) {
        android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
        .replace(R.id.frame_container, fragment).commit();

        mDrawerList.setItemChecked(position, true);
        mDrawerList.setSelection(position);
        setTitle(navMenuTitles[position]);
        mDrawerLayout.closeDrawer(mDrawerList);
        } 

    }

    @Override
    public void setTitle(CharSequence title) {
        mTitle = title;
        getActionBar().setTitle(mTitle);
    }

    /**
     * When using the ActionBarDrawerToggle, you must call it during
     * onPostCreate() and onConfigurationChanged()...
     */

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        // Pass any configuration change to the drawer toggls
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

}

解决方案

Solved. Turns out I had two declarations of the Fragments. One tag declaration inside the activitymain.xml and fragment transaction in the MainActivity.java. According to http://developer.android.com/guide/components/fragments.html you can declare fragments in either of them, but not both. This is why I was getting double views.

这篇关于解决:重复在后台滚动列表视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆