gpt4 book ai didi

java - 如何从单独的 Activity 中从回收者 View 中删除卡片 View

转载 作者:行者123 更新时间:2023-12-02 11:16:02 25 4
gpt4 key购买 nike

情况如下:

我正在尝试从卡片 View 上的 ArrayList(通过 Firebase 数据库填充)中删除用户信息。

此卡片 View 填充在回收器 View 中。当用户单击 Recycler View 中的卡片时,他们将通过 Intent 进入详细 Activity 。

在 Intent 中,有更多的用户数据以及批准或拒绝用户的选项。

我希望能够拒绝用户,然后从回收者 View 中删除他们的卡。

我一直遇到空指针错误,并且不知道还能去哪里。

堆栈跟踪位于末尾。

非常感谢您在此事上花费的时间和提供的帮助。

相关代码如下:

fragment :

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;

}

}

RecyclerView 适配器:

此类包含rejectionButton 和onClickListener 但它始终指向null。

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();
}
}

从 OrganizerDashboardPendingTab 类触发的音乐家详细信息类。

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;
}
}




}

card_musician_info.xml:

<?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)

最佳答案

在您正在使用的 PendingMusicianInfoAdapter 中:-

rejectionButton = view.findViewById(R.id.musician_rejection); //这是你的空指针

原因:-

在你的card_musician_info.xml中您没有任何按钮“musician_rejection”

注意:- 每次遇到空指针问题时,最常见的原因是初始化错误/id 不匹配/或正确的 XML 中没有引用。在这种情况下,您可能之前有“musician_rejection”,它已在您的“R”类中注册,但后来您可能已将其删除,但它以某种方式保留在您的“R”类中。或者,您很可能在其他 XML 中包含“musician_rejection”。 Android Studio 不够聪明,无法理解使用父 XML 文件来获取 JAVA 文件中的所有 id 引用。

使用http://jakewharton.github.io/butterknife/这消除了所有此类问题。

逐步使用调试器,以便更好地理解。

关于java - 如何从单独的 Activity 中从回收者 View 中删除卡片 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50283841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com