2017-07-27 92 views
0

在我的自定义列表片段中,我显示了糖果名称及其图像(甜A,甜B,甜C)的列表。请检查我的Sweet.java代码。当用户点击列表项时,它会在Fragment中显示相应的甜点。这个概念是完美的。但我的问题是,当用户点击后退按钮后,查看相应的甜点,列表项显示两次。 (这是甜的A,甜的B,甜的C,甜的A,甜的B,甜的C)。 (只有前3项是可点击的)。再次,如果我点击列表项目(这是甜蜜的A)它会变成甜蜜A.如果我点击后退按钮,那么列表会再次克隆自己。它表现为(甜A,甜B,甜C,甜A,甜B,甜C,甜A,甜B,甜C)。请帮帮我。自定义列表片段列表项每当我按下按钮时增加

这是我Sweet.java代码

public class Sweet extends ListFragment { 
    String[] players = {"sweet A", "sweet B", "sweet C"}; 
    int[] images = {R.drawable.veg, R.drawable.veg2, R.drawable.veg}; 
    ArrayList<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>(); 
    SimpleAdapter adapter; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     HashMap<String, String> map = new HashMap<String, String>(); 
     for (int i = 0; i < players.length; i++) { 
      map = new HashMap<String, String>(); 
      map.put("Player", players[i]); 
      map.put("Image", Integer.toString(images[i])); 
      data.add(map); 
     } 
     String[] from = {"Player", "Image"}; 
     int[] to = {R.id.nameTxt, R.id.imageView1}; 
     adapter = new SimpleAdapter(getActivity(), data, R.layout.sweet, from, to); 
     setListAdapter(adapter); 
     return super.onCreateView(inflater, container, savedInstanceState); 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> av, View v, int pos, 
            long id) { 
       selectItem(pos); 
      } 
     }); 
    } 

    private void selectItem(int pos) { 
     Fragment newFragment; 
     FragmentTransaction transaction = getFragmentManager().beginTransaction(); 

     switch (pos) { 
      case 0: 
       newFragment = new SweetA(); 
       transaction.replace(R.id.containerID, newFragment); 
       transaction.addToBackStack(null); 
       transaction.commit(); 
       break; 

      case 1: 
       newFragment = new SweetB(); 
       transaction.replace(R.id.containerID, newFragment); 
       transaction.addToBackStack(null); 
       transaction.commit(); 
       break; 
     } 
    } 

    @Override 
    public String toString() { 
     return "Home"; 
    } 
} 

这是我sweet.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 
    <ImageView 
     android:background="@drawable/customshape" 
     android:id="@+id/imageView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginLeft="20dp" 
     android:layout_marginTop="10dp" 
     android:layout_marginBottom="10dp" 
     android:src="@drawable/veg" /> 
    <TextView 
     android:id="@+id/nameTxt" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_alignTop="@+id/imageView1" 
     android:layout_marginTop="10dp" 
     android:padding="10dp" 
     android:layout_toRightOf="@+id/imageView1" 
     android:text="Name" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 
</RelativeLayout> 
+0

是甜蜜的片段也addToBackStack为自己片段的交易? – Neha

回答

0

这也有窍门。感谢您的帮助NEHA

newFragment = new SweetA(); 
transaction.addToBackStack(null); 
transaction.hide(this); 
transaction.add(R.id.containerID, newFragment); 
transaction.commit(); 
break; 

完整的代码如下

public class Sweet extends ListFragment { 
    String[] players = {"sweet A", "sweet B", "sweet C"}; 
    int[] images = {R.drawable.veg, R.drawable.veg2, R.drawable.veg}; 
    ArrayList<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>(); 
    SimpleAdapter adapter; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     HashMap<String, String> map = new HashMap<String, String>(); 
     for (int i = 0; i < players.length; i++) { 
      map = new HashMap<String, String>(); 
      map.put("Player", players[i]); 
      map.put("Image", Integer.toString(images[i])); 
      data.add(map); 
     } 
     String[] from = {"Player", "Image"}; 
     int[] to = {R.id.nameTxt, R.id.imageView1}; 
     adapter = new SimpleAdapter(getActivity(), data, R.layout.sweet, from, to); 
     setListAdapter(adapter); 
     return super.onCreateView(inflater, container, savedInstanceState); 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> av, View v, int pos, 
            long id) { 
       selectItem(pos); 
      } 
     }); 
    } 

    private void selectItem(int pos) { 
     Fragment newFragment; 
     FragmentTransaction transaction = getFragmentManager().beginTransaction(); 

     switch (pos) { 
      case 0: 
       newFragment = new SweetA(); 
       transaction.addToBackStack(null); 
       transaction.hide(this); 
       transaction.add(R.id.containerID, newFragment); 
       transaction.commit(); 
       break; 

     } 
    } 

    @Override 
    public String toString() { 
     return "Home"; 
    } 
} 
0

在onCreate方法中的一个片段,但onCreateView()被调用一次,当片段被称为这是第一次创建,甚至当从后台堆栈中加载片段时,所以无论何时按下从后台堆栈中拾取的片段并根据逻辑再次添加数据。 因此,为了纠正这种情况,您可以将您的列表设置为本地,以防止数据一次又一次地累加。

+0

任何代码示例? – cool

+0

只需在onCreateView中保留你的列表,而不是让它成为全局的 – Neha

相关问题