Recycler View:java.lang.NullPointerException - null对象引用上的android.widget.EditText.getText()

时间:2017-01-19 03:49:50

标签: android android-fragments android-recyclerview recycler-adapter

我在尝试将数据传递到回收站视图时遇到以下异常:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.laraib.dynamicdataapp, PID: 31538
              java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
                  at com.example.laraib.dynamicdataapp.MainActivity$1.onClick(MainActivity.java:55)
                  at android.view.View.performClick(View.java:4766)
                  at android.view.View$PerformClick.run(View.java:19683)
                  at android.os.Handler.handleCallback(Handler.java:739)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:135)
                  at android.app.ActivityThread.main(ActivityThread.java:5538)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:372)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
  

我在片段所在的主要活动中创建了一个片段   托管Recycler视图和一个事件适配器类附加到   recycleler视图显示数据。必须传递数据   动态。当用户点击浮动操作栏按钮时,a   弹出窗口将打开,用户必须在其中输入值   编辑文本字段,按下确定按钮,数据将被添加到   片段回收者视图。

这是我的代码:

EventFragment.java

public class EventFragment extends Fragment{

List<Event> event=new ArrayList<>();
EventAdapter adapter;
FloatingActionButton fab;

public EventFragment() {}
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    final View rootView = inflater.inflate(R.layout.fragment_friend_event, container, false);
    final RecyclerView rv = (RecyclerView) rootView.findViewById(R.id.event_recycler_view);
    fab = (FloatingActionButton) rootView.findViewById(R.id.floating_bar_event);
    rv.setHasFixedSize(true);
    LinearLayoutManager ll = new LinearLayoutManager(getActivity());
    rv.setLayoutManager(ll);
    rv.setItemAnimator(new DefaultItemAnimator());
    adapter = new EventAdapter(event,this.getActivity());
    rv.setAdapter(adapter);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            ((MainActivity )  getActivity()).displayDialog();
        }
    });
    return rootView;
}}

MainActivity.java

public class MainActivity extends AppCompatActivity {

EditText event_name;
EditText event_text;
Button saveButton;
RecyclerView rv;
EventAdapter adapter;
List<Event> event=new ArrayList<>();
String s;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    Toolbar toolbar = (Toolbar) findViewById(R.id.main_toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(false);
    getSupportActionBar().setHomeButtonEnabled(true);
    Fragment fragmentEvent = new EventFragment();
    setTitle("Home");
    getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentEvent).commit();
}

public void displayDialog()
{
    Dialog dialog = new Dialog(this);
    dialog.setTitle("Add Event");
    dialog.setContentView(R.layout.popup_events);
    event_text = (EditText) findViewById(R.id.editText_msg);
    event_name = (EditText) findViewById(R.id.editText_name);
    rv = (RecyclerView) findViewById(R.id.event_recycler_view);
    saveButton = (Button) dialog.findViewById(R.id.button_ok);
    saveButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // save(event_name.getText().toString());
            s = event_name.getText().toString();
            event_name.setText("");
            adapter = new EventAdapter(EventData.getEventData(s),MainActivity.this);
            Log.d("username", event_name.getText().toString());
            rv.setAdapter(adapter);
        }
    });
    dialog.show();
}}

EventData.java

public class EventData {
    public static List<Event> getEventData(String e)
    {
        List<Event> data = new ArrayList<>();
            Event item = new Event();
            item.setEventText(e);
            data.add(item);
        Log.d("method invoked", e);
        return data;
    }
}

EventAdapter.java

public class EventAdapter extends RecyclerView.Adapter<EventAdapter.EventViewHolder> {

private List<Event> eventData;
private LayoutInflater inflater;

public EventAdapter(List<Event> eventData, Context context){
    inflater = LayoutInflater.from(context);
    this.eventData = eventData;
}


@Override
public EventViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.content_events, parent, false);
    EventAdapter.EventViewHolder vh = new EventAdapter.EventViewHolder(v);
    return vh;
}

@Override
public void onBindViewHolder(EventViewHolder holder, final int position) {
    holder.eventTextView.setText(eventData.get(position).getEventText().toString());
    Log.i("CALL","Button adapter is invoked");
}



@Override
public int getItemCount() {
    return eventData.size();
}

public static class EventViewHolder extends RecyclerView.ViewHolder {
    public CardView eventCardView;
    public TextView eventTextView;

    public EventViewHolder(View itemView)
    {
        super(itemView);
        eventCardView = (CardView) itemView.findViewById(R.id.event_card_view);
        eventTextView = (TextView) itemView.findViewById(R.id.event_text);
    }
}

public void add(Event item,int position)
{
    eventData.add(item);
    notifyItemInserted(position);
}

public void remove(Event item)
{
    int position = eventData.indexOf(item);
    eventData.remove(position);
    notifyItemRemoved(position);
}}

popup_event.xml

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <View
        android:layout_height="10dp"
        android:layout_width="match_parent"></View>
    <TextView
        android:layout_height="30dp"
        android:layout_width="match_parent"
        android:text="Add Event"
        android:textSize="25dp"
        android:textAlignment="center"
        />
    <View
        android:layout_height="10dp"
        android:layout_width="match_parent"></View>
    <TableRow
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:text="Name:"
            android:textSize="20dp"
            android:id="@+id/textView_name"
            android:layout_column="1"/>
        <EditText
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:id="@+id/editText_name"
            android:layout_column="2"/>
    </TableRow>
    <View
        android:layout_height="10dp"
        android:layout_width="match_parent"></View>
    <TableRow
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:text="Date:"
            android:textSize="20dp"
            android:id="@+id/textView_msg"
            android:layout_column="1"/>
        <EditText
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:id="@+id/editText_msg"
            android:layout_column="2"/>
    </TableRow>
    <View
        android:layout_height="10dp"
        android:layout_width="match_parent"></View>
    <TableRow
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="OK"
            android:id="@+id/button_ok"
            android:layout_column="3" />
    </TableRow>
</TableLayout>

1 个答案:

答案 0 :(得分:0)

简单的方法是:当用户点击按钮确定时使用处理程序发送/接收消息。

在托管回收商视图的活动中

public static final int MSG_USER_INPUT = 0x01;

public Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);

        switch (msg.what) {
            case MSG_USER_INPUT:
                String userInputStr = msg.obj.toString();
                // refine your data here, ex: mAdapter.setData(); 
                // remember to call notifyDataSetChanged() in adapter
                break;

            default:
                //
                break;
        }
    }
};

将此处理程序传递给弹出构造函数

然后在OnClick of Ok按钮

Message message = new Message();
message.obj = mEdtText.getText().toString();
message.what = YourActivity.MSG_USER_INPUT;

mHandler.sendMessage(message);

希望这有帮助!

进一步解决方案,imo,你应该尝试RxJava!