我在尝试将数据传递到回收站视图时遇到以下异常:
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>
答案 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!