Java 将项目添加到ListView

Java 将项目添加到ListView,java,android,listview,Java,Android,Listview,我正在尝试在运行时将项添加到放置在选项卡上的ListView。 但是当我这样做的时候,我得到了一个错误。有3个选项卡,我不使用ListFragments,因为我在所有选项卡中都有不同的内容 下面是我的代码 swipateabfragment.java public class SwipeTabFragment extends Fragment { private String tab; private int color; @Override public v

我正在尝试在运行时将项添加到放置在选项卡上的ListView。 但是当我这样做的时候,我得到了一个错误。有3个选项卡,我不使用ListFragments,因为我在所有选项卡中都有不同的内容

下面是我的代码

swipateabfragment.java

public class SwipeTabFragment extends Fragment {

    private String tab;
    private int color;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bundle bundle = getArguments();
        tab = bundle.getString("tab");
        color = bundle.getInt("color");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.bookshelf, null);
        TextView tv = (TextView) view.findViewById(R.id.textView);
        tv.setText(tab);
        view.setBackgroundResource(color);
        return view;
    }
}
TabPagerAdapter.java

public class TabPagerAdapter extends FragmentPagerAdapter {

    public TabPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int index) {
        Bundle bundle = new Bundle();
        String tab = "";
        int colorResId = 0;
        SwipeTabFragment swipeTabFragment = new SwipeTabFragment();
        switch (index) {
            case 0:
                tab = "BookShelf";
                bundle.putString("tab",tab);
                swipeTabFragment.setArguments(bundle);
                return swipeTabFragment;


               // break;
            case 1:
                tab = "Now Listening";
                colorResId = R.color.color2;
                BookFragment bookFragment = new BookFragment();
                return bookFragment;
                //break;
            case 2:
                tab = "Library";
                colorResId = R.color.color3;
                TabLibrary tabLibrary = new TabLibrary();
                return tabLibrary;
                break;
        }

        return null;
    }

    @Override
    public int getCount() {
        return 3;
    }
}
TabLibrary.java

public class TabLibrary extends Fragment {

    final String LOG_TAG = "myLogs";
    ListView lvLibList;
    ImageButton btAddItem;
    ArrayList<String> list = new ArrayList<String>();
    ArrayAdapter<String> adapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.library, parent, false);

        ListView lvLibList = (ListView)v.findViewById(R.id.lvLibList);
        ImageButton btn = (ImageButton)v.findViewById(R.id.btAddItem);
        adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, list);
        View.OnClickListener listener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EditText edit = (EditText)v.findViewById(R.id.eAddItem);
                list.add(edit.getText().toString());
                edit.setText("");
                adapter.notifyDataSetChanged();
            }
        };
        btn.setOnClickListener(listener);
        lvLibList.setAdapter(adapter);
        return v;
    }

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}

发布我的评论作为答案,因为我很确定这就是问题所在:

变量edit似乎为null。这是因为当您调用v.findviewbyd时,实际上是在单击的视图上调用它,而不是在片段的视图上

所以你有两个选择:

更改片段视图的名称。例如,视图v1=充气机。充气机。布局。库,父项,false;然后将行更改为v1.findviewbyd 更改onClick参数的名称。例如,公共void onClickView v1{。
希望能有所帮助。

@Gurusharan S是对的,问题在于变量的名称。为了避免混淆,我建议将代码更改为:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.library, parent, false); //Change the name from v to view

    ListView lvLibList = (ListView)view.findViewById(R.id.lvLibList);
    ImageButton btn = (ImageButton)view.findViewById(R.id.btAddItem);
    EditText edit = (EditText)view.findViewById(R.id.eAddItem);   //Initialize the EditText outside of the click method

    adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, list);

    View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            list.add(edit.getText().toString());
            edit.setText("");
            adapter.notifyDataSetChanged();
        }
    };
    btn.setOnClickListener(listener);
    lvLibList.setAdapter(adapter);
    return view;
}

将来,我建议给变量起更多有意义的名字,有时需要多编码一点,但这是值得的。

什么错误?也发布日志猫只是一个猜测-你能尝试使用adapter.addedit.getText.toString而不是list.add…in TabLibrary.java吗?这也不会导致错误-因此发布错误会帮助我们为您提供比随意猜测更好的解决方案。您是否可以尝试使用adapter.addedit.getText.toString而不是list.add…in TabLibrary.java?它没有帮助确定-检查变量edit是否为null-我的猜测是v。findViewByID不会返回预期的EditText,因为v是单击的按钮,而不是片段。请尝试更改正式的pa参数名称为onClickView v1.View.OnClickListener listener=new View.OnClickListener{@Override public void onClickView v1{EditText eAddItem=EditTextv1.findViewByIdR.id.eAddItem;list.addeditem.getText.toString;adapter.notifydatasangetched;};它不起作用,但当我只是添加list.add123而不是list.addAddItem.getText.toString时,它起作用了。您觉得list.addAddItem.getText.toString怎么样?只是为了回答您的第一条不起作用的评论-您弄错了-您更改了这个onClickView v1,然后再次更改了这个v1.findViewById,这不是必需的//错误:47,26错误:局部变量edit是从内部类中访问的;需要声明为final//我正在尝试声明,但我不明白。final EditText edit=EditTextview.findViewByIdR.id.eAddItem;应该这样做