Listview 替换第一个项目而不是创建新项目

Posted

技术标签:

【中文标题】Listview 替换第一个项目而不是创建新项目【英文标题】:Listview replaces first item instead of creating new items 【发布时间】:2015-03-28 03:44:18 【问题描述】:

我正在尝试使用FragmentsString 项目添加到我的ListView

我有四个Buttons。每次点击 Button 时,ListView 应该添加一个 String 项目:“按钮 1、2、3 或 4 已点击”

问题是它不断用点击的ButtonString 替换第一个String 项目。它不会创建新项目。

这是我的代码:

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);    

这是所有相关的代码。我想我正确地连接了片段。我假设的问题是ListViewFragment1 - 我可能没有正确使用adapter。我尝试了许多不同的方法,但没有任何效果。有人可以帮忙吗?

*提醒 - 我只是希望 ListView 在每次单击 Button 时创建一个新项目。目前它只替换第一项。

【问题讨论】:

每次调用 changeText() 时,您都会创建一个新的 ArrayAdapter,其中包含一个空数据集。将该实例化和 ListView 初始化移到别处;例如,onCreateView(). 我之前尝试过,但出现运行时错误。我会将上面编辑的代码与错误日志一起发布 【参考方案1】:

每次您拨打changeText() 时,您的适配器都会重置,因此只会显示一项

像这样改变你的片段

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();


【讨论】:

稍作改动。你可以忽略它们。主要思想是在方法changeText()之外实例化适配器

以上是关于Listview 替换第一个项目而不是创建新项目的主要内容,如果未能解决你的问题,请参考以下文章

Espresso - 如何定位并单击ListView中的第一个项目

我看不到添加到我的 ListView 的第一个项目

在 ListView 中重复项目?它不能正常工作,第一个项目显示在第三个位置,并再次从第一个项目重复

带有导航器的列表视图推送到不同的屏幕而不是单个屏幕

在 WPF ListView C# 中获取第一个可见项

Android ListView 项目动画 - 仅动画第一个可见项目