我有一个带有recyclerview和一个按钮的活动。在onBindViewHolder的recyclerview适配器中,将onClickListener设置为列表项的布局。单击此按钮后,我要将选定的联系人(列表项类型)传递给我的活动,然后传递到列表中,以便可以将其作为请求发送给我的服务器。
单击该项目时,我希望颜色更改为突出显示的蓝色,并且让屏幕底部的按钮说“继续-x联系人”(x =选择了许多联系人。)在我将按钮添加到活动中之前,此功能一直有效。
我遇到的问题是,该按钮未与按钮ID关联,并且在单击项目后崩溃了,因为无法在空对象引用上调用setText()。
错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setText(java.lang.CharSequence)' on a null object reference
除非按钮是我从适配器调用活动对象的方式,否则我不理解按钮为何为空。
感谢任何帮助或建议!
RecyclerViewAdapter :(我在适配器中有其他方法和ViewHolder类,它们工作正常。这是唯一影响结果afaik的方法)
private CreateGroupAccountStage2 createGroupAccountStage2 = new CreateGroupAccountStage2();
public List<Contacts> contactsList;
public List<Contacts> selectedContacts = new ArrayList<>();
@Override
public void onBindViewHolder(@NonNull final ViewHolder viewHolder, final int position) {
final Contacts contacts = contactsList.get(position);
viewHolder.contactName.setText(contacts.getContactName());
viewHolder.contactItem.setOnClickListener(new View.OnClickListener() { //Set on click listener to item layout
@Override
public void onClick(View view) {
if (!contacts.getIsPressedValue()) {
contacts.setPressedTrue(); // Method that changes boolean value stored in the Contact object
viewHolder.contactItem.setBackgroundResource(R.color.createGroupAccountContactItemPressed);
selectedContacts.add(contacts);
} else {
viewHolder.contactItem.setBackgroundResource(R.color.whiteText);
contacts.setPressedFalse(); // Method that changes boolean value stored in the Contact object
selectedContacts.remove(contacts);
}
createGroupAccountStage2.updateSelectedContacts(contactsList);
}
});
}
活动:
Button stage2Continue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create_group_stage2);
stage2Continue = (Button) findViewById(R.id.createGroupAccountStage2ContinueBTN);
setUpActionBar();
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
ArrayList<Contacts> fullContactsList = new ArrayList<>();
fullContactsList.add(new Contacts(R.drawable.human_photo, "Human One", "humanone@gmail.com"));
fullContactsList.add(new Contacts(R.drawable.human_photo, "Human Two", "humantwo@gmail.com"));
setUpContactsRecyclerView(fullContactsList); //Sets up recycler view (works fine)
}
public void updateSelectedContacts(List<Contacts> contacts) {
int listSize = contacts.size();
updateContinueButton(listSize);
}
public void updateContinueButton(int selectedContactsListSize) {
String listSize = Integer.toString(selectedContactsListSize);
String buttonText = "Continue - " + listSize + " contacts";
if(selectedContactsListSize > 0) {
stage2Continue.setText(buttonText);
} else {
stage2Continue.setVisibility(View.INVISIBLE);
}
}
布局XML:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="grouppay.dylankilbride.com.activities.CreateGroupAccountStage2">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ToolbarTheme">
<android.support.v7.widget.Toolbar
android:id="@+id/createAccountStage2Toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/whiteText"
app:popupTheme="@style/ToolbarTheme" />
</android.support.design.widget.AppBarLayout>
<Button
android:id="@+id/createGroupAccountStage2ContinueBTN"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="40dp"
android:layout_alignParentBottom="true"
android:text="@string/generic_continue"
android:textSize="15sp"
android:visibility="invisible"
android:textColor="@color/whiteText"
android:background="@drawable/generic_rounded_continue_button_bg"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/createGroupAccountStage2ContactsRV"
android:layout_width="match_parent"
android:layout_marginTop="?attr/actionBarSize"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
联系人列表项的布局XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="70dp"
android:gravity="center_vertical"
android:padding="10dp"
android:id="@+id/createGroupAccountStage2ContactLL">
<de.hdodenhof.circleimageview.CircleImageView
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/createGroupAccountStage2ContactImgTV"
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@drawable/human_photo"
app:civ_border_width="1dp"
app:civ_border_color="@color/profileImageBorder"/>
<TextView
android:id="@+id/createGroupAccountStage2ContactNameTV"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:textSize="20sp"
android:fontFamily="@font/cairo"
tools:text="Human Example"
/>
</LinearLayout>
答案 0 :(得分:0)
似乎您需要在RecyclerViewAdapter中实现onCreateViewHolder()
,以便使用包含createGroupAccountStage2ContinueBTN按钮的布局使ViewHolder膨胀
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = mInflater.inflate(R.layout.your_item_layout, parent, false);
return new ViewHolder(itemView);
}
答案 1 :(得分:0)
检查您的导入,如果在您的代码中导入了正确的contactName视图,则您有可能在其他任何xml文件中为另一个视图使用相同的id,并且由于导入错误,该视图的null视图没有膨胀。