Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:Listview在我启动新活动并按back返回时会复制自身_Android_Listview_Tabs_Duplicates_Items - Fatal编程技术网

Android:Listview在我启动新活动并按back返回时会复制自身

Android:Listview在我启动新活动并按back返回时会复制自身,android,listview,tabs,duplicates,items,Android,Listview,Tabs,Duplicates,Items,我有两个列表视图,它们是视图页导航选项卡中的片段。单击列表视图中的项目时,将启动一个新活动。但是,当我按“上一步”按钮返回选项卡式列表视图时,列表视图已加倍,如果我打开“活动”并再次返回,它将再次加倍,并将继续这样做。此外,我还有另一个选项卡式列表视图,其中有五个选项卡,当我从其中一个视图中移除两个选项卡时。当我返回该视图时,该视图中的项目会加倍,这与所有其他选项卡相同。两个ListView的代码是相同的。我尝试了list.clear(),它只清除所有列表项,并在视图持有者中使用了“else”语

我有两个列表视图,它们是视图页导航选项卡中的片段。单击列表视图中的项目时,将启动一个新活动。但是,当我按“上一步”按钮返回选项卡式列表视图时,列表视图已加倍,如果我打开“活动”并再次返回,它将再次加倍,并将继续这样做。此外,我还有另一个选项卡式列表视图,其中有五个选项卡,当我从其中一个视图中移除两个选项卡时。当我返回该视图时,该视图中的项目会加倍,这与所有其他选项卡相同。两个ListView的代码是相同的。我尝试了list.clear(),它只清除所有列表项,并在视图持有者中使用了“else”语句(由其他堆栈溢出答案推荐)。但每次列表视图仍然重复。另外,除非你还没有注意到我对安卓系统还很陌生

下面是两个选项卡式活动中的列表视图片段(Due_Today_片段)的代码

      import java.util.ArrayList;
import java.util.List;

import android.content.Intent;
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.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;


public class Due_Today_Fragment extends Fragment  {
    private List<homeworkdue> myhomeworkdue;

    static class ViewHolder {
        public ImageView imageView;
        public TextView HomeworkDueText;
        public TextView DescriptionText;
        public TextView TeacherText;
      }


    public static final String KEY_HOMEWORK="homework";
    public static final String KEY_DESC="desc";

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        return inflater.inflate(R.layout.activity_main, container, false); }


    @Override
    public void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        myhomeworkdue = new ArrayList<homeworkdue>();
        populatehomeworkdueList();
        populateListView();
        registerClickCallback();
    }

    private void registerClickCallback() {
        ListView list = (ListView)getView().findViewById(R.id.listView1);
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            public void onItemClick(AdapterView<?> parent, View viewClicked, int position, long id) {

                homeworkdue clickedhomeworkdue = myhomeworkdue.get(position);

                Intent intent = new Intent(getActivity(), homeworkdueDetailsActivity.class);
                intent.putExtra(KEY_HOMEWORK, clickedhomeworkdue.getHomeworkdue());
                intent.putExtra(KEY_DESC, clickedhomeworkdue.getDesciption());

                startActivity(intent);
            }
        });
        }


    private void populatehomeworkdueList() {
        myhomeworkdue.add(new homeworkdue("History Homework", "Description 1", R.drawable.global_studies, "Anderson"));
        myhomeworkdue.add(new homeworkdue("Math Homework", "Description 2", R.drawable.mathematics, "Klein"));
        myhomeworkdue.add(new homeworkdue("English Homework", "Description 3", R.drawable.english, "Reed"));
        myhomeworkdue.add(new homeworkdue("Spanish Homework", "Description 4", R.drawable.spanish, "Joya"));
        myhomeworkdue.add(new homeworkdue("Science Homework", "Description 5", R.drawable.science, "Poole"));
    }

    private void populateListView() {
        ArrayAdapter<homeworkdue> adapter = new MyListAdapter();
        ListView list = (ListView)getView().findViewById(R.id.listView1);
        list.setAdapter(adapter);


    }


    public class MyListAdapter extends ArrayAdapter<homeworkdue>  {
        public MyListAdapter() {
            super(getActivity(), R.layout.item_view, myhomeworkdue);
        }

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

            if(convertView==null){
            convertView = getActivity().getLayoutInflater().inflate(R.layout.item_view, parent, false);
             holder = new ViewHolder();

             holder.imageView = (ImageView)convertView.findViewById(R.id.item_iconclass);

            holder.HomeworkDueText = (TextView) convertView.findViewById(R.id.item_texthomeworkdue);

            holder.DescriptionText = (TextView) convertView.findViewById(R.id.item_textdescription);

            holder.TeacherText = (TextView) convertView.findViewById(R.id.item_textteacher);

            convertView.setTag(holder);


            }

        else {
            holder = (ViewHolder) convertView.getTag();
        }

        homeworkdue currenthomeworkdue = myhomeworkdue.get(position);

        holder.imageView.setImageResource(currenthomeworkdue.getIconID());


        holder.HomeworkDueText.setText(currenthomeworkdue.getHomeworkdue());


        holder.DescriptionText.setText(currenthomeworkdue.getDesciption());


        holder.TeacherText.setText(currenthomeworkdue.getTeacher());

        return convertView;

    }

        }


}
下面是制表符片段的代码

import java.lang.reflect.Field;
import com.actionbarsherlock.app.SherlockFragment;
import com.astuetz.PagerSlidingTabStrip;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragments2 extends SherlockFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.viewpager_main, container, false);
        // Locate the ViewPager in viewpager_main.xml
        ViewPager pager = (ViewPager) view.findViewById(R.id.viewPager);
        // Set the ViewPagerAdapter into ViewPager
        pager.setAdapter(new ViewPagerAdapter(getChildFragmentManager()));
        PagerSlidingTabStrip tabs = (PagerSlidingTabStrip) view.findViewById(R.id.pagerTabStrip);
        tabs.setViewPager(pager);

        return view;
    }

    @Override
    public void onDetach() {
        super.onDetach();
        try {
            Field childFragmentManager = Fragment.class
                    .getDeclaredField("mChildFragmentManager");
            childFragmentManager.setAccessible(true);
            childFragmentManager.set(this, null);
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }
}
这里是为到期作业定义字符串的地方

public class homeworkdue {
    private String homework;
    private String desc;
    private int IconID;
    private String teacher;



    public homeworkdue(String homework, String desc, int IconID, String teacher) {



        super();
        this.homework = homework;
        this.desc = desc;
        this.IconID = IconID;
        this.teacher = teacher;
    }

    public String getHomeworkdue() {
        return homework;
    }
    public String getDesciption() {
        return desc;
    }   
    public int getIconID() {
        return IconID;
    }   
    public String getTeacher() {
        return teacher;
    }


    }
下面是包含在五个选项卡中的片段代码

import java.util.ArrayList;
import java.util.List;

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.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;


public class Thursday extends Fragment  {



    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        return inflater.inflate(R.layout.schedule_list_view, container, false); }

    private List<schedule> myschedule = new ArrayList<schedule>();



    static class ViewHolder {

        public TextView HomeworkDueText;
      }

    public void onStart() {
        super.onStart();

        populatescheduleList();
        populateListView();

    }


    private void populatescheduleList() {
        myschedule.add(new schedule("E Band"));
        myschedule.add(new schedule("G Band"));
        myschedule.add(new schedule("F Band"));
        myschedule.add(new schedule("H Band"));
        myschedule.add(new schedule("A Band"));
        myschedule.add(new schedule("C Band"));
        myschedule.add(new schedule("D Band"));
    }

    private void populateListView() {
        ArrayAdapter<schedule> adapter = new MyListAdapter();
        ListView list = (ListView)getView().findViewById(R.id.listView2);
        list.setAdapter(adapter);

    }


     public class MyListAdapter extends ArrayAdapter<schedule>  {
            public MyListAdapter() {
                super(getActivity(), R.layout.item_view, myschedule);
            }

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

                if(convertView==null){
                    convertView = getActivity().getLayoutInflater().inflate(R.layout.schedule_list_item, parent, false);
                 holder = new ViewHolder();

                 holder.HomeworkDueText = (TextView) convertView.findViewById(R.id.bandText);

                convertView.setTag(holder);
                }

            else {
                holder = (ViewHolder) convertView.getTag();
            }

                schedule currenthomeworkdue = myschedule.get(position);

                holder.HomeworkDueText.setText(currenthomeworkdue.Band());

            return convertView;


        }

        }

}
如果您需要更多信息,请提前询问并感谢您的帮助


我已经试着修复这个bug两天了,我束手无策。

背后的原因是,我们在创建片段时会声明一个新列表,所以当你回到片段时,它不会声明一个新列表,而是使用旧列表。因此,为了解决这个问题,您需要将以下代码分为两部分:

private List<homeworkdue> myhomeworkdue = new ArrayList<homeworkdue>();
然后将其余的移动到
onResume

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    myhomeworkdue = new ArrayList<homeworkdue>();
    populatehomeworkdueList();
    populateListView();
    registerClickCallback();
}
@覆盖
受保护的void onResume(){
//TODO自动生成的方法存根
super.onResume();
myhomeworkdue=newArrayList();
PopulateHomeWorkueList();
populateListView();
registerClickCallback();
}
第二个
列表视图中的问题相同,因为它们是相同的


希望这对你有用。如果有效,请给我反馈。

或者只需调用
clear()
方法;如果没有它,它会在调用新数据时一直保持在那里

在我使用“回收者视图”时遇到了同样的问题。对我来说,在onResume()方法中清除recyclerView解决了这些问题

@Override
    public void onResume() {
        super.onResume();
        usersList.clear();

    }

这里userList是我添加到回收视图中的列表。希望它也能对你起作用

感谢您的回复,但有一件事我很困惑,当您说“移动前一代码的一部分”时,我应该将其移动到哪里?我的意思是将其添加到
onResume
对不起,如果我不清楚的话。我将编辑我的答案。请告诉我你是否成功了,因为我做了我认为你希望我做的事情(我猜onResume控制着你从活动中回来时发生的事情),并在onStart之前添加了onResume,在onResume中添加了声明的第一部分,在onResume中添加了声明的第二部分。但随后我的应用程序崩溃了,它在“holder=(ViewHolder)convertView.getTag();”行中出现一个错误,称Listview大小为0或Arraylist为0(如果我正确解释它)。我已经用编辑过的代码更新了我的帖子。哦,很抱歉,我没有很好地阅读您的代码,崩溃背后的原因是
onStart
onResume
之前启动,并且您的arrayList尚未声明。因此,您需要删除声明后的
onStart
,并将所有内容添加到
onResume
。请检查我的代码,我已经更新了。不要担心,无论是第一次还是之后的任何时候,+1从4个小时以来一直在试图解决这个问题,并且感到沮丧。现在很有魅力。非常感谢。我已经更改了DueToday片段,因此它包含了供将来参考的固定和工作代码哇,简单和简短的ans
private List<homeworkdue> myhomeworkdue;
@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    myhomeworkdue = new ArrayList<homeworkdue>();
    populatehomeworkdueList();
    populateListView();
    registerClickCallback();
}
@Override
    public void onResume() {
        super.onResume();
        usersList.clear();

    }