簡體   English   中英

每當我按“后退”按鈕時,“自定義列表片段”列表項都會增加

[英]Custom List Fragment list item increases every time when i press back button

在我的自定義列表片段中,我正在顯示糖果名稱及其圖像的列表(甜味A,甜味B,甜味C)。 請檢查我的Sweet.java代碼。 當用戶單擊列表項時,它將在“片段”中顯示相應的糖果。 這個概念運行良好。 但是我的問題是,當用戶在查看相應的甜品之后單擊后退按鈕時,列表項顯示兩次。 (即甜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>

在片段中一次調用onCreate方法,但是在第一次創建該片段時甚至在從后堆棧加載片段時都調用onCreateView(),因此每當您按回時,都會從后堆棧中拾取片段並符合邏輯數據再次添加。 因此,為了糾正這種情況,您可以將列表設為本地,以防止一次又一次地添加數據。

這也可以解決問題。 感謝您的幫助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";
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM