【问题标题】:ListView replaces first object instead of adding a new oneListView 替换第一个对象而不是添加一个新对象
【发布时间】:2017-07-05 21:59:32
【问题描述】:

我创建了一个测试项目,在该项目中我试图创建一个列表视图,用户可以在单击按钮时添加到该列表视图中。该按钮打开一个带有 editText 的新活动和另一个返回列表视图活动的按钮,并且应该已经添加了一个项目。它第一次工作,但是当我添加另一个项目时,它会替换旧项目。我现在已经搜索了一段时间,所有其他答案似乎都对我没有帮助。提前致谢。

public class MainActivity extends Activity {

ListView simpleList;
String input;
ArrayList<Item> listItems =new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    simpleList = (ListView) findViewById(R.id.listView);
    addData();
    MyAdapter myAdapter=new MyAdapter(this,R.layout.row, listItems);
    simpleList.setAdapter(myAdapter);
}

public void addData(){
    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        input = extras.getString("Homework");
        listItems.add(new Item(input, input, input));
    }
}

public void toInput(View view){
    Intent intent = new Intent(this, inputScreen.class);
    startActivity(intent);
}}

这是我的主要活动,适配器是在此类中制作的自定义适配器。

public class MyAdapter extends ArrayAdapter<Item> {
ArrayList<Item> listItems = new ArrayList<>();

public MyAdapter(Context context, int textViewResourceId, ArrayList<Item> objects){
    super(context, textViewResourceId, objects);
    listItems = objects;
}

public int getCount(){
    return super.getCount();
}

public View getView(int position, View convertView, ViewGroup parent){
    View v = convertView;
    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    v = inflater.inflate(R.layout.row, null);
    TextView textView = (TextView) v.findViewById(R.id.homeworkDisplay);
    TextView textView2 = (TextView) v.findViewById(R.id.dueDisplay);
    TextView textView3 = (TextView) v.findViewById(R.id.classDisplay);
    textView.setText(listItems.get(position).getHomework());
    textView2.setText(listItems.get(position).getDate());
    textView3.setText(listItems.get(position).getClasses());
    return v;
}}

添加到列表视图的字符串是从另一个从editText获取它的活动发送的,这是它的类

public class inputScreen extends Activity{

EditText userInput;


public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.input_screen);
    userInput = (EditText) findViewById(R.id.editText);


}

public void sendInfo(View view){
    Intent goingBack = new Intent(this,MainActivity.class);
    goingBack.putExtra("Homework", userInput.getText().toString());
    startActivity(goingBack);

}}

我知道那里有很多代码,您不需要全部阅读,因为我确信问题出在 MainActivity 中。我有另一个类,称为返回家庭作业的项目。谢谢!

【问题讨论】:

    标签: android listview


    【解决方案1】:

    使用的 startActivity() 不正确。 你的活动堆栈是这样的:

    开始 ~~~~~~~~~~~~ 主要活动 ~~~~~~~~~~~~

    在 MainActivity() 中调用 toInput 之后

    ~~~~~~~~~~~~ 输入屏幕(活动) 主要活动 ~~~~~~~~~~~~

    那么当你在 InputScreen 中调用 send() 时

    ~~~~~~~~~~~~ 主要活动 输入画面 主要活动 ~~~~~~~~~~~~

    看看发生了什么?

    第一次在 InputScreen 中调用 send() 时使用 extras 启动 MainActivity

    然后你开始了一个新的 MainActivity ,然后去 addData() ,你得到了数据,并改变了 listView。

    但是当你再次这样做时,你总是会开始新的活动,所以只有第一个会改变

    总是重复第一步总是开始一个新的活动

    您应该在 MainActivity 中调用 startActivityForResult() 来启动 inputScreen 并覆盖 MainActivity 中的 onActivityResult 方法

    只需谷歌 startActivity 和 startActivityForResult 你就会解决这个问题。 你应该用谷歌搜索的另一个关键词是,listView --> 数据源

    对不起,我不是英语母语者,如果我做错了什么,请原谅我~~~~

    【讨论】:

    • 谢谢老哥,我去看看能不能用
    【解决方案2】:

    作者:https://stackoverflow.com/users/2936153/rohit5k2

    来源:Listview replaces first item instead of creating new items

    每次您拨打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();
    }
    }
    

    【讨论】:

    • 这对我没有帮助,我已经阅读了这篇文章,但我仍然不知道该怎么做。
    • 这可能需要一段时间。
    • 谢谢老兄!您可以根据需要花费尽可能多的时间。
    • 嘿,我想通了,所以不用担心代码。
    猜你喜欢
    • 1970-01-01
    • 2012-12-05
    • 2021-04-23
    • 1970-01-01
    • 2021-01-11
    • 2015-03-28
    • 1970-01-01
    • 2020-06-07
    • 2014-04-13
    相关资源
    最近更新 更多