Listview 替换第一个项目而不是创建新项目
Posted
技术标签:
【中文标题】Listview 替换第一个项目而不是创建新项目【英文标题】:Listview replaces first item instead of creating new items 【发布时间】:2015-03-28 03:44:18 【问题描述】:我正在尝试使用Fragments
将String
项目添加到我的ListView
。
我有四个Buttons
。每次点击 Button
时,ListView
应该添加一个 String
项目:“按钮 1、2、3 或 4 已点击”
问题是它不断用点击的Button
String
替换第一个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中的第一个项目