Listview replaces first item instead of creating new items

爱⌒轻易说出口 提交于 2019-12-13 17:14:58

问题


I am trying to add String items to my ListView using Fragments.

I have four Buttons. Each time a Button is clicked, the ListView should add a String item: "Button 1,2,3, or 4 clicked"

The problem is that it keeps replacing the first String item with the clicked Button String. It does not create new items.

Here is my code:

ListViewFragment.java:

public class ListViewFragment1 extends Fragment {

    protected ArrayAdapter<String> adapter1;

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

    public void changeText(String data){

        //Build Adapter
        adapter1 = new ArrayAdapter<String>(getActivity(), R.layout.items);

        //Configure the list view
        ListView list1 = (ListView) getActivity().findViewById(R.id.listview1);

        list1.setAdapter(adapter1);

        adapter1.add(data);
        adapter1.notifyDataSetChanged();
    }
}

ButtonLayoutFragment.java:

public class ButtonLayoutFragment extends Fragment implements View.OnClickListener {

    Communicator comm;

    @Override
    public View onCreateView(LayoutInflater inflater,
            @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)     {   

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

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        comm = (Communicator) getActivity();

        Button[] bttn_arr = new Button[] {b0, b1, b2, b3}; 

        button_list.addAll(Arrays.asList(bttn_arr));

        button_list.set(0,(Button) getActivity().findViewById(R.id.button0));
        button_list.set(1,(Button) getActivity().findViewById(R.id.button1));
        button_list.set(2,(Button) getActivity().findViewById(R.id.button2));
        button_list.set(3,(Button) getActivity().findViewById(R.id.button3));

        for(Button b:button_list){
            b.setOnClickListener(this);
        }
    }

    @Override
    public void onClick(View v) {
          switch(v.getId()){
              case R.id.button0:
                  comm.respond("item0 added");
                  break;
              case R.id.button1:
                  comm.respond("item1 added");
                  break;
              case R.id.button2:
                  comm.respond("item2 added"); 
                break;
              case R.id.button3:
                  comm.respond("item3 added"); 
                break;
      }     
    }
}

MainActivity.java:

public class MainActivity extends Activity implements Communicator {

    FragmentManager manager;

    ListViewFragment1 frag2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.game_activity);

        ButtonLayoutFragment frag = new ButtonLayoutFragment();
        frag2 = new ListViewFragment1();
        ListViewFragment2 frag3 = new ListViewFragment2();
        manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.add(R.id.FragmentLayout, frag, "Fragment");
        transaction.add(R.id.fragment2, frag2, "Fragment2");
        transaction.commit();
    }

    @Override
    public void respond(String data) {
        frag2.changeText(data);
    }

}

Communicator.java:

public interface Communicator {
    public void respond(String data);    
}

This is all the relevant code. I think I connected the fragments correctly. The problem I assume is with ListViewFragment1 - I probably did not use the adapter correctly. I tried many different ways but nothing has been working. Can someone please help?

*Reminder - I simply want the ListView to create a new item each time a Button is clicked. Currently it only replaces the first item.


回答1:


Everytime you call changeText() your adapter is reset so only one item will be displayed

Change your fragment like this

public class ListViewFragment1 extends Fragment {

protected ArrayAdapter<String> adapter1;
ListView list1;

@Override
public View onCreateView(LayoutInflater inflater,
        @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.list_view_fragment1, container, false);       
    adapter1 = new ArrayAdapter<String>(getActivity(), R.layout.items);
    list1 = (ListView) view.findViewById(R.id.listview1);
    list1.setAdapter(adapter1);
    return view;
}

public void changeText(String data){
    adapter1.add(data);
    adapter1.notifyDataSetChanged();
}
}


来源:https://stackoverflow.com/questions/28205853/listview-replaces-first-item-instead-of-creating-new-items

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!