避免在列表视图中重新添加项目

avoid re adding items in list view

在我的应用程序中,我有一个 SlidingTabLayout,每个选项卡都包含一个列表视图。当我多次浏览选项卡时,每次都会将项目添加到列表视图中。我怎样才能防止这种行为?

第二题

在每个选项卡上我想添加第二个片段来保存一些控件,每个片段都必须与列表视图中的列表项链接,当我切换选项卡时必须选择第一个列表项显示相应的片段。我怎样才能实现这种行为?

我的主要activity

public class MainActivity extends AppCompatActivity {
Toolbar toolbar;
ViewPager viewPager;
ViewPagerAdapter viewPagerAdapter;
SlidingTabLayout slidingTabLayout;
CharSequence Titles[] = {"Basic", "Sensors", "USB"};
int Numboftabs = 3;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // Creating The Toolbar and setting it as the Toolbar for the activity
    toolbar = (Toolbar) findViewById(R.id.tool_bar);
    setSupportActionBar(toolbar);
    // Creating The ViewPagerAdapter and Passing Fragment Manager, Titles for the Tabs and Number Of Tabs.
    viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager(), Titles);
    // Assigning ViewPager View and setting the adapter
    viewPager = (ViewPager) findViewById(R.id.pager);
    viewPager.setAdapter(viewPagerAdapter);
    // Assiging the Sliding Tab Layout View
    slidingTabLayout = (SlidingTabLayout) findViewById(R.id.tabs);
    slidingTabLayout.setDistributeEvenly(true); // To make the Tabs Fixed set this true, This makes the tabs Space Evenly in Available width
    // Setting Custom Color for the Scroll bar indicator of the Tab View
    slidingTabLayout.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() {
        @Override
        public int getIndicatorColor(int position) {
            return getResources().getColor(R.color.tabsScrollColor);
        }
    });
    // Setting the ViewPager For the SlidingTabsLayout
    slidingTabLayout.setViewPager(viewPager);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, 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();
    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

}

我的查看寻呼机适配器

public class ViewPagerAdapter extends FragmentPagerAdapter {

CharSequence Titles[]; // This will Store the Titles of the Tabs which are Going to be passed when ViewPagerAdapter is created
int NumbOfTabs; // Store the number of tabs, this will also be passed when the ViewPagerAdapter is created
FragmentManager fragmentManager;
private static final int tabIcons[] = {R.drawable.hand, R.drawable.sensors, R.drawable.fastobjects, R.drawable.gears, R.drawable.usb};
// Build a Constructor and assign the passed Values to appropriate values in the class
public ViewPagerAdapter(FragmentManager fm, CharSequence mTitles[]) {
    super(fm);
    this.fragmentManager = fm;
    this.Titles = mTitles;
    this.NumbOfTabs = mTitles.length;
}
//This method return the fragment for the every position in the View Pager
@Override
public Fragment getItem(int position) {
    Fragment fragment = fragmentManager.findFragmentByTag("android:switcher:" + R.id.pager + ":" + position);
    if (fragment == null) {
        Bundle arguments = new Bundle();
        arguments.putInt("position", position);
        arguments.putString("frag","android:switcher:" + R.id.pager + ":" + position);
        fragment = new Tab_Modes();
        fragment.setArguments(arguments);
        return fragment;
     }
    else
        return null;

}
// This method return the titles for the Tabs in the Tab Strip
@Override
public CharSequence getPageTitle(int position) {
    return Titles[position];
}
// This method return the Number of tabs for the tabs Strip
@Override
public int getCount() {
    return NumbOfTabs;
}

}

我的列表视图创建者

public class Tab_Modes extends ListFragment {
private ArrayList<NameImg> items = new ArrayList<NameImg>();
private int crtMode;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = super.onCreateView(inflater, container, savedInstanceState);
    Bundle arguments = getArguments();
    crtMode = arguments.getInt("position");
    Toast.makeText(getActivity(), "Crt Frag :" + arguments.getString("frag"), Toast.LENGTH_LONG).show();
    switch (crtMode) {
        case 0:
            items.add(new NameImg("Manual", "Simple camera Control", R.drawable.hand));
            items.add(new NameImg("Bulb", "Long Exposure", R.drawable.bulb));
            items.add(new NameImg("Time Lapse", "Frame by Frame Movie", R.drawable.timelapse));
            items.add(new NameImg("HDR", "High Dinamic Range", R.drawable.hdr));
            items.add(new NameImg("IR", "Infra RED Control", R.drawable.ir));
            break;
        case 1:
            items.add(new NameImg("Triggered", "Trigger camera ", R.drawable.triggrered));
            items.add(new NameImg("Dark Room", "Long Exposure", R.drawable.darkroom));
            items.add(new NameImg("Lightning", "Frame by Frame Movie", R.drawable.lightning));
            break;
        case 3:
            items.add(new NameImg("1", "USB1", R.drawable.usb));
            items.add(new NameImg("2", "USB2", R.drawable.waterdrops));
            break;
    }
    setListAdapter(new ModesItemAdapter(getActivity(), items));
    //ListView myLV  = null;
    //myLV = (ListView) myLV.findViewById(R.id.customListView);
    //myLV.setItemChecked(0, true);
    return v;
}

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        //getListView().setSelector(android.R.color.holo_blue_bright);
        //Toast.makeText(getActivity(), "selected item :" + position + " ID :" + id, Toast.LENGTH_LONG).show();
        FragmentManager fm = getFragmentManager();
        ModeControls myControls;
        myControls = (ModeControls) fm.findFragmentByTag(position + "ModesContent" );
        if (myControls == null) {//if the fragment dosen't exists we create it
            Bundle arguments = new Bundle();
            arguments.putString("myTxt", "selected item :" + position + " ID :" + id);
            FragmentTransaction ft = fm.beginTransaction();
            myControls = new ModeControls();
            myControls.setArguments(arguments);
            ft.add(R.id.main_activity, myControls).commit();
        }
    }

}

和我的模式适配器 - 用于我的数据结构

public class ModesItemAdapter extends ArrayAdapter<NameImg> {

public ModesItemAdapter(Context c, List<NameImg> items) {
    super(c, 0, items);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ItemView itemView = (ItemView)convertView;
    if (null == itemView)
        itemView = ItemView.inflate(parent);
    itemView.setItem(getItem(position));
    return itemView;
}

}

使用

items.clear() 

items = new ArrayList<NameImg>();

switch() 语句之前。您正在向 items arraylist 添加数据,但没有清除列表。所以,你的arraylist越来越大了。