Java 如何从回收器视图、从单独的活动中删除卡片视图
情况如下: 我试图从卡片视图上的ArrayList(通过Firebase数据库填充)中删除用户信息 此卡片视图填充在回收器视图中。当用户在“回收者”视图中单击一张卡时,他们将通过一个意图进入一个详细活动 在intent中,有更多的用户数据以及批准或拒绝用户的选项 我希望能够拒绝用户,然后从“回收者”视图中删除他们的卡 我一直遇到一个空指针错误,我不知道还能去哪里 堆栈跟踪位于末尾 非常感谢您在这件事上的时间和帮助 相关代码如下: 片段:Java 如何从回收器视图、从单独的活动中删除卡片视图,java,android,Java,Android,情况如下: 我试图从卡片视图上的ArrayList(通过Firebase数据库填充)中删除用户信息 此卡片视图填充在回收器视图中。当用户在“回收者”视图中单击一张卡时,他们将通过一个意图进入一个详细活动 在intent中,有更多的用户数据以及批准或拒绝用户的选项 我希望能够拒绝用户,然后从“回收者”视图中删除他们的卡 我一直遇到一个空指针错误,我不知道还能去哪里 堆栈跟踪位于末尾 非常感谢您在这件事上的时间和帮助 相关代码如下: 片段: package org.codefordenver.enc
package org.codefordenver.encorelink;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import java.util.ArrayList;
import java.util.Objects;
public class OrganizerDashboardPendingTab extends Fragment {
private String userId;
//Arraylist to hold our list of volunteer musicians
public static ArrayList<String> volunteerSmallView = new ArrayList<>();
public static ArrayList<String> volunteerDetail = new ArrayList<>();
public static ArrayList<String> volunteerLink = new ArrayList<>();
//private String field members to hold temp String data
private String tempFirst;
private String tempTalent;
private String tempLastName;
private String tempPhoneNumber;
private String tempStreetAddress;
private String tempCity;
private String tempZipcode;
public static String tempVideoLink;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
final RecyclerView musicianInfoRecycler = (RecyclerView) inflater.inflate(R.layout.tab1, container, false);
//Checking to make sure user is logged in and is not null
FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
userId = user.getUid();
}
//setting DatabaseReference variable so we can search through the correct node in our DB
DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference().child(CreateMusicianProfile.MUSICIAN_PROFILE);
//Instantiating and declaring our Adapter object for our Recycler View
final PendingMusicianInfoAdapter adapter = new PendingMusicianInfoAdapter(volunteerSmallView);
//this clear is a must so we aren't getting duplicated data in the cardview
volunteerSmallView.clear();
//Adding child event listener to our database object
mDatabase.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
//iterate through each dataSnapshot inside mDatabase
for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
//if we get a first name, add it to temp string
if (dataSnapshot1.getKey().equals("firstName")) {
tempFirst = Objects.requireNonNull(dataSnapshot1.getValue(String.class));
}
if (dataSnapshot1.getKey().equals("lastName")) {
tempLastName = Objects.requireNonNull(dataSnapshot1.getValue(String.class));
}
//if we get a musical talent, save it also into a temp string
if (dataSnapshot1.getKey().equals("musicalTalent")) {
tempTalent = Objects.requireNonNull("\nTalent: " + dataSnapshot1.getValue(String.class));
//in order to display all the string data together in one card,
//we have to add each temp string to the array list.
volunteerSmallView.add(tempFirst + " " + tempLastName + tempTalent);
}
if (dataSnapshot1.getKey().equals("phoneNumber")) {
tempPhoneNumber = Objects.requireNonNull( dataSnapshot1.getValue(String.class));
}
if (dataSnapshot1.getKey().equals("streetAddress")) {
tempStreetAddress = Objects.requireNonNull(dataSnapshot1.getValue(String.class));
}
if (dataSnapshot1.getKey().equals("city")) {
tempCity = Objects.requireNonNull(dataSnapshot1.getValue(String.class));
}
if (dataSnapshot1.getKey().equals("zipcode")) {
tempZipcode = Objects.requireNonNull("Zipcode: " + dataSnapshot1.getValue(String.class));
}
if (dataSnapshot1.getKey().equals("videoLink")) {
tempVideoLink = Objects.requireNonNull(dataSnapshot1.getValue(String.class));
volunteerLink.add(tempVideoLink);
volunteerDetail.add(tempFirst + " " + tempLastName +
"\n" + tempPhoneNumber +
"\n" + tempStreetAddress +
"\n" + tempCity + ", " + tempZipcode + "\n" + tempTalent + "\n");
}
}
//set adapater equal to our adapater object
musicianInfoRecycler.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
adapter.notifyDataSetChanged();
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
adapter.notifyDataSetChanged();
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
musicianInfoRecycler.setLayoutManager(linearLayoutManager);
adapter.setListener(new PendingMusicianInfoAdapter.Listener() {
@Override
public void onClick(int position) {
Intent intent = new Intent(getActivity(), MusicianDetails.class);
intent.putExtra(MusicianDetails.EXTRA_NUMBER, position);
getActivity().startActivity(intent);
}
});
return musicianInfoRecycler;
}
}
package org.codefordenver.encorelink;
导入android.content.Intent;
导入android.net.Uri;
导入android.os.Bundle;
导入android.support.annotation.Nullable;
导入android.support.v4.app.Fragment;
导入android.support.v7.widget.LinearLayoutManager;
导入android.support.v7.widget.RecyclerView;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入com.google.firebase.auth.FirebaseAuth;
导入com.google.firebase.auth.FirebaseUser;
导入com.google.firebase.database.ChildEventListener;
导入com.google.firebase.database.DataSnapshot;
导入com.google.firebase.database.DatabaseError;
导入com.google.firebase.database.DatabaseReference;
导入com.google.firebase.database.FirebaseDatabase;
导入java.util.ArrayList;
导入java.util.Objects;
公共类OrganizerDashboardPendingTab扩展片段{
私有字符串用户标识;
//Arraylist保存我们的志愿音乐家名单
publicstaticarraylist=newarraylist();
public static ArrayList detail=new ArrayList();
publicstaticarraylistlink=newarraylist();
//用于保存临时字符串数据的专用字符串字段成员
私有字符串优先;
私有字符串;
私有字符串模板名;
私有字符串tempPhoneNumber;
私有字符串tempStreetAddress;
私人城市;
私有字符串tempZipcode;
公共静态字符串tempVideoLink;
@可空
@凌驾
创建视图时的公共视图(LayoutFlater充气机、@Nullable ViewGroup容器、Bundle savedInstanceState){
最终RecyclerView musicianInfoRecycler=(RecyclerView)充气机。充气(R.layout.tab1,容器,假);
//检查以确保用户已登录且不为空
FirebaseAuth FirebaseAuth=FirebaseAuth.getInstance();
FirebaseUser=firebaseAuth.getCurrentUser();
如果(用户!=null){
userId=user.getUid();
}
//设置DatabaseReference变量,以便在数据库中搜索正确的节点
DatabaseReference mDatabase=FirebaseDatabase.getInstance().getReference().child(CreateMusicianProfile.Musitor\u PROFILE);
//为回收器视图实例化和声明适配器对象
最终PendingMusicianInfoAdapter=新PendingMusicianInfoAdapter(视图);
//这是必须的,因此我们不会在cardview中获得重复的数据
使用smallview.clear();
//将子事件侦听器添加到数据库对象
mDatabase.addChildEventListener(新的ChildEventListener(){
@凌驾
公共void onChildAdded(DataSnapshot DataSnapshot,字符串s){
//遍历mDatabase中的每个dataSnapshot
对于(DataSnapshot dataSnapshot1:DataSnapshot.getChildren()){
//如果我们得到一个名字,将它添加到临时字符串中
if(dataSnapshot1.getKey().equals(“firstName”)){
tempFirst=Objects.requirennull(dataSnapshot1.getValue(String.class));
}
if(dataSnapshot1.getKey().equals(“lastName”)){
tempLastName=Objects.requirennull(dataSnapshot1.getValue(String.class));
}
//如果我们有音乐天赋,也可以将其保存到临时字符串中
if(dataSnapshot1.getKey().equals(“musicalTalent”)){
试探=Objects.requirennull(“\n试探:+dataSnapshot1.getValue(String.class));
//为了在一张卡中同时显示所有字符串数据,
//我们必须将每个临时字符串添加到数组列表中。
添加(tempFirst+“”+tempLastName+tempLastName);
}
if(dataSnapshot1.getKey().equals(“phoneNumber”)){
tempPhoneNumber=Objects.requireNonNull(dataSnapshot1.getValue(String.class));
}
if(dataSnapshot1.getKey().equals(“streetAddress”)){
tempStreetAddress=Objects.requirennoull(dataSnapshot1.getValue(String.class));
}
如果(dataSnapshot1.getKey().equals(“城市”)){
tempCity=Objects.requirennull(dataSnapshot1.getValue(String.class));
}
if(dataSnapshot1.getKey().equals(“zipcode”)){
tempZipcode=Objects.requireNonNull(“Zipcode:+dataSnapshot1.getValue(String.class));
}
if(dataSnapshot1.getKey().equals(“视频链接”)){
tempVideoLink=Objects.requirennoull(dataSnapshot1.getValue(String.class));
添加(临时视频链接);
志愿者详细信息。添加(tempFirst+“”+tempLastName)+
“\n”+临时电话号码+
“\n”+临时地址+
“\n”+tempCity+,“+tempZip”
package org.codefordenver.encorelink;
import android.annotation.SuppressLint;
import android.content.Context;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
public class PendingMusicianInfoAdapter extends RecyclerView.Adapter<PendingMusicianInfoAdapter.ViewHolder> {
private ArrayList<String> musicianInfo;
private Listener listener;
public interface Listener {
void onClick(int position);
}
public void setListener(Listener listener) {
this.listener = listener;
}
class ViewHolder extends RecyclerView.ViewHolder {
private CardView cardView;
Button rejectionButton;
public ViewHolder(CardView view) {
super(view);
cardView = view;
rejectionButton = view.findViewById(R.id.musician_rejection);
rejectionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
removeAt(getAdapterPosition());
}catch (Exception e) {
e.printStackTrace();
}
}
});
}
void bind(final int position) {
TextView textView = cardView.findViewById(R.id.pending_musician_info);
textView.setText(musicianInfo.get(position));
cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
listener.onClick(position);
}
}
});
}
void removeAt(int position) {
musicianInfo.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, musicianInfo.size());
}
}
public PendingMusicianInfoAdapter(ArrayList<String> musicianInfo) {
this.musicianInfo = musicianInfo;
}
//called when recyclerview instantiates new viewholder instance
//creates the views
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
CardView cv = (CardView) LayoutInflater.from(parent.getContext()).inflate(R.layout.card_musician_info, parent, false);
return new ViewHolder(cv);
}
//called when recycler view wants to populate data from model for the user to see
//after each view holder is created, recycler view calls onBindViewHolder to populate item
//with data
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.bind(position);
}
//returns number of items in data source
@Override
public int getItemCount() {
return musicianInfo.size();
}
}
package org.codefordenver.encorelink;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Patterns;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import java.util.ArrayList;
import java.util.Objects;
import java.util.regex.Matcher;
public class MusicianDetails extends AppCompatActivity {
public static final String EXTRA_NUMBER = "number";
//
// public static ArrayList<String> approvedMusicians = new ArrayList<>();
private TextView closeButton;
public static int cardNumber;
private String talentURL;
private TextView musicalTalentLink;
private Button approvalButton;
private FirebaseAuth firebaseAuth;
private DatabaseReference databaseReference;
private String userId;
public static boolean approved;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_musician_details);
closeButton = findViewById(R.id.x_button);
TextView textView = findViewById(R.id.musician_details);
musicalTalentLink = findViewById(R.id.musical_talent_link);
approvalButton = findViewById(R.id.musician_approval);
databaseReference = FirebaseDatabase.getInstance().getReference();
firebaseAuth = FirebaseAuth.getInstance();
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
userId = user.getUid();
}
cardNumber = (int) Objects.requireNonNull(getIntent().getExtras()).get(EXTRA_NUMBER);
String musicianDetails = OrganizerDashboardPendingTab.volunteerDetail.get(cardNumber);
findURL(OrganizerDashboardPendingTab.volunteerLink);
musicalTalentLink.setText(talentURL);
textView.setText(musicianDetails);
musicalTalentLink.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(talentURL));
startActivity(intent);
} catch (ActivityNotFoundException e){
Toast.makeText(MusicianDetails.this, "Bad URL!", Toast.LENGTH_SHORT).show();
}
}
});
approvalButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// approvedMusicians.add(OrganizerDashboardPendingTab.volunteerDetail.get(cardNumber));
databaseReference.child(CreateOrganizerProfile.ORGANIZER_PROFILE).child(userId).child("approved_musicians").child(String.valueOf(cardNumber)).
setValue(OrganizerDashboardPendingTab.volunteerDetail.get(cardNumber));
Toast.makeText(MusicianDetails.this, "Musician approved!", Toast.LENGTH_SHORT - 3).show();
Toast.makeText(MusicianDetails.this, "Moving musician to In Progress...", Toast.LENGTH_SHORT).show();
approved = true;
}
});
closeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
public void findURL(ArrayList<String> data) {
Matcher m = Patterns.WEB_URL.matcher(data.get (cardNumber));
while (m.find()) {
String url = m.group();
talentURL = url;
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="100dp"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/musician_info_cardview"
card_view:cardElevation="3.5sp"
android:layout_margin="8dp"
card_view:cardCornerRadius="4dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/pending_musician_info"
android:textSize="25dp"
android:paddingLeft="8dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</android.support.v7.widget.CardView>
E/AndroidRuntime: FATAL EXCEPTION: main
Process: org.codefordenver.encorelink, PID: 12123
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at org.codefordenver.encorelink.PendingMusicianInfoAdapter$ViewHolder.<init>(PendingMusicianInfoAdapter.java:41)
at org.codefordenver.encorelink.PendingMusicianInfoAdapter.onCreateViewHolder(PendingMusicianInfoAdapter.java:94)
at org.codefordenver.encorelink.PendingMusicianInfoAdapter.onCreateViewHolder(PendingMusicianInfoAdapter.java:16)
at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6493)
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5680)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5563)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5559)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2229)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1556)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1516)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:608)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3693)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3410)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3962)
at android.view.View.layout(View.java:19659)
at android.view.ViewGroup.layout(ViewGroup.java:6075)
at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1767)
at android.view.View.layout(View.java:19659)
at android.view.ViewGroup.layout(ViewGroup.java:6075)
at android.support.design.widget.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:132)
at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42)
at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1361)
at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:869)
at android.view.View.layout(View.java:19659)
at android.view.ViewGroup.layout(ViewGroup.java:6075)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:19659)
at android.view.ViewGroup.layout(ViewGroup.java:6075)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1544)
at android.view.View.layout(View.java:19659)
at android.view.ViewGroup.layout(ViewGroup.java:6075)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:19659)
at android.view.ViewGroup.layout(ViewGroup.java:6075)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1544)
at android.view.View.layout(View.java:19659)
at android.view.ViewGroup.layout(ViewGroup.java:6075)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:761)
at android.view.View.layout(View.java:19659)
at android.view.ViewGroup.layout(ViewGroup.java:6075)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2496)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2212)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1392)
E/AndroidRuntime: at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6752)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
at android.view.Choreographer.doCallbacks(Choreographer.java:723)
at android.view.Choreographer.doFrame(Choreographer.java:658)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)