使用自定义适配器不显示 SwipeCards

SwipeCards not showing using custom adapter

我正在使用这张刷卡卡开发类似 tinder 的应用程序 https://github.com/Diolor/Swipecards。我制作了一个自定义适配器,将数据设置为刷卡。一切都很好我检查了logcat数据打印的地方。我检查了 getItemCount() 的 logcat。它显示数据的大小。我的问题是刷卡卡中没有显示数据。

更新

这段代码中有两种方法

  1. getPeople() 运行良好,向刷卡显示数据。

  2. getNearbyPeople 也可以使用,但数据未显示在刷卡中。这两种方法都使用相同的代码和适配器。有时它显示数据但花费的时间太长几乎半小时。一个在工作,另一个不工作。希望你明白我说的。提前致谢。

所有代码如下

MainActivity.class

import android.os.Bundle;
import android.os.Looper;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;


import com.firebase.geofire.GeoFire;
import com.firebase.geofire.GeoLocation;
import com.firebase.geofire.GeoQueryDataEventListener;
import com.firebase.geofire.core.GeoHash;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationCallback;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationResult;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.tasks.OnSuccessListener;
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 com.google.firebase.database.ValueEventListener;
import com.lorentzos.flingswipe.SwipeFlingAdapterView;
import com.pk.tinder.R;
import com.pk.tinder.cards.Card;
import com.pk.tinder.cards.CardAdapter;
import com.pk.tinder.matches.MatchActivity;

import java.util.ArrayList;

import de.hdodenhof.circleimageview.CircleImageView;

public class MainActivity extends AppCompatActivity {

    FusedLocationProviderClient client;
    private CardAdapter cardAdapter;
    ArrayList<Card> cardList;

    SwipeFlingAdapterView flingContainer;
    CardView cardViewAccountButton;
    CardView cardViewLike, cardViewDislike, cardViewSuperLike;

    FirebaseAuth mAuth;
    FirebaseUser mFirebaseUser;
    DatabaseReference mUsersDb;

    private String currentUid;
    private String userSex;
    private String oppositeUserSex;

    GeoFire geoFire;
    GeoLocation geoLocation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        flingContainer = findViewById(R.id.frame);

        cardList = new ArrayList<Card>();

        //firebase
        mAuth = FirebaseAuth.getInstance();
        mFirebaseUser = mAuth.getCurrentUser();

        currentUid = mFirebaseUser.getUid();


        //database
        mUsersDb = FirebaseDatabase.getInstance().getReference().child("Users");

        //location updates
        geoFire = new GeoFire(mUsersDb);
        client = LocationServices.getFusedLocationProviderClient(this);
        final LocationRequest locationRequest = new LocationRequest();
        locationRequest.setInterval(1000);
        locationRequest.setFastestInterval(100);
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

        client.requestLocationUpdates(locationRequest,
                new LocationCallback() {
                    @Override
                    public void onLocationResult(LocationResult locationResult) {
                        super.onLocationResult(locationResult);
                        if (locationResult != null) {
                            geoLocation = new GeoLocation(locationResult.getLastLocation().getLatitude(),
                                    locationResult.getLastLocation().getLongitude());

                            GeoHash geoHash = new GeoHash(geoLocation);

                            if (mAuth.getCurrentUser() != null) {
                                DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Users")
                                        .child(mAuth.getCurrentUser().getUid());
                                ref.child("g").setValue(geoHash.getGeoHashString());
                                ref.child("l").child("0").setValue(geoLocation.latitude);
                                ref.child("l").child("1").setValue(geoLocation.longitude);
                            }
                        }
                    }
                },
                Looper.getMainLooper())
                .addOnSuccessListener(new OnSuccessListener<Void>() {

                    @Override
                    public void onSuccess(Void aVoid) {

                    }
                });
       //getPeople();
         showNearbyPeople();
        flingContainer.setAdapter(cardAdapter); 
}

//data fetching from firebase without location  
public void getPeople() {
        mUsersDb.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                Log.d("log", dataSnapshot.getValue().toString());
                if (dataSnapshot.exists()){

                    Log.d("log", dataSnapshot.getValue().toString());

                    Card card;

                      card = new Card(dataSnapshot.child("account").child("name").getValue().toString(),
                                dataSnapshot.getKey(),
                                profileImageUrl);

                    cardList.add(card);
            cardAdapter = new CardAdapter(getApplicationContext(), R.layout.swipe_card_item, cardList);

                    cardAdapter.notifyDataSetChanged();
            Log.d("log386", String.valueOf(cardAdapter.getItemCount()));

                }         
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        });
    }


//data fetching through firebase with nearby location
    private void showNearbyPeople() {
        Log.d("loggeo", geoLocation.toString());
        geoFire.queryAtLocation(geoLocation, 5)
                .addGeoQueryDataEventListener(new GeoQueryDataEventListener() {
                    @Override
                    public void onDataEntered(DataSnapshot dataSnapshot, GeoLocation location) {
                        Card card = null;
                        if (dataSnapshot.exists(){

                            Log.d("log", dataSnapshot.toString());


                          card = new Card(dataSnapshot.child("account").child("name").getValue().toString(),
                                dataSnapshot.getKey(),
                                profileImageUrl);


                            Log.d("log 382", "Name :" + card.getName() + "key :" + card.getUid() + " url :" + card.getProfileImageUrl());
                            cardList.add(card);
                            cardAdapter = new CardAdapter(getApplicationContext(), R.layout.swipe_card_item, cardList);
                            cardAdapter.notifyDataSetChanged();
                            Log.d("log386", String.valueOf(cardAdapter.getItemCount()));

                            Log.d("log 387", "Name :" + cardList.get(0).getName() + "key :" + cardList.get(0).getUid() + " url :" + cardList.get(0).getProfileImageUrl());
                        }
                    }

                    @Override
                    public void onDataExited(DataSnapshot dataSnapshot) {
                    }

                    @Override
                    public void onDataMoved(DataSnapshot dataSnapshot, GeoLocation location) {
                    }

                    @Override
                    public void onDataChanged(DataSnapshot dataSnapshot, GeoLocation location) {
                    }

                    @Override
                    public void onGeoQueryReady() {
                    }

                    @Override
                    public void onGeoQueryError(DatabaseError error) {
                    }
                });
    }
}

CardAdapter.class

public class CardAdapter extends ArrayAdapter<Card> {

    private ArrayList<Card> cards = new ArrayList<>();
    private Context context;

    public CardAdapter(@NonNull Context context, int resourceId, ArrayList<Card> cards) {
        super(context, resourceId, cards);
        this.cards = cards;
        this.context = context;
        notifyDataSetChanged();
    }

    public View getView(int position, View convertView, @NotNull ViewGroup parent) {

        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.swipe_card_item, parent, false);
        }
        Card card = cards.get(position);

        Log.d("logsize", String.valueOf(getItemCount()));
        Log.d("logadapter", "Name :" + card.getName() + "uId :" + card.getUid() + "url :" + card.getProfileImageUrl());

        TextView textViewName = convertView.findViewById(R.id.textViewFullName);
        ImageView imageViewPhoto = convertView.findViewById(R.id.imageViewPhoto);

        textViewName.setText(card.getName());

        Glide.with(getContext()).load(card.getProfileImageUrl()).centerCrop().into(imageViewPhoto);

        Log.d("log32", "Name :" + card.getName() + "uId :" + card.getUid() + "url :" + card.getProfileImageUrl());
        return convertView;
    }

    public int getItemCount() {
        return cards.size();
    }

    @Override
    public int getItemViewType(int position) {
        return super.getItemViewType(position);
    }
}

Card.class

public class Card {

    private String name;
    private String uid;
    private String profileImageUrl;
    private String location;

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }

    public String getProfileImageUrl() {
        return profileImageUrl;
    }

    public void setProfileImageUrl(String profileImageUrl) {
        this.profileImageUrl = profileImageUrl;
    }

    public Card(String name, String uid, String profileImageUrl) {
        this.name = name;
        this.uid = uid;
        this.profileImageUrl = profileImageUrl;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }
}

swipe_card_item.xml

<FrameLayout 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:layout_gravity="center">

    <androidx.cardview.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:layout_margin="16dp"
        android:background="#fff"
        android:elevation="2dp"
        app:cardCornerRadius="16dp">

        <ImageView
            android:id="@+id/imageViewPhoto"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@drawable/ic_launcher_foreground" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:orientation="vertical"
            android:background="@drawable/gradient1"
            android:padding="16dp">

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="bottom|start"
                android:orientation="horizontal">

                <TextView
                    android:id="@+id/textViewFullName"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="bottom"
                    android:textColor="@color/colorWhite"
                    android:textSize="20sp"
                    tools:text="UserName" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:layout_marginStart="8dp"
                    android:gravity="center"
                    android:text="19"
                    android:textColor="@color/colorWhite"
                    android:textSize="18sp" />
            </LinearLayout>

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Mumbai, India"
                    android:textColor="@color/colorWhite" />
            </LinearLayout>
        </LinearLayout>
    </androidx.cardview.widget.CardView>

</FrameLayout>

Logcat

2019-11-23 13:20:41.409 16591-16656/com.pk.tindertest D/log375: Name :Sanjukey :UJykVjc9RuQNPPehHbbYZ0PpY8h1 url :https://firebasestorage.googleapis.com/v0/b/tinder-pk.appspot.com/o/profileImages%2FUJykVjc9RuQNPPehHbbYZ0PpY8h1?alt=media&token=3bf3130d-4940-4bef-904f-a520894f1d81
2019-11-23 13:20:41.410 16591-16656/com.pk.tindertest D/log377: Name :Menkakey :73iFRWoBcJW02m2W1QU1gW1glLH3 url :https://firebasestorage.googleapis.com/v0/b/tinder-pk.appspot.com/o/profileImages%2F73iFRWoBcJW02m2W1QU1gW1glLH3?alt=media&token=0ee8adc3-f483-41b9-910c-ef5017a98dfe
2019-11-23 13:20:41.410 16591-16656/com.pk.tindertest D/log381: 5
2019-11-23 13:20:45.011 16591-16617/com.pk.tindertest V/FA: Inactivity, disconnecting from the service
2019-11-23 13:21:00.496 16591-16596/com.pk.tindertest I/zygote64: Do partial code cache collection, code=60KB, data=38KB
2019-11-23 13:21:00.496 16591-16596/com.pk.tindertest I/zygote64: After code cache collection, code=60KB, data=38KB
2019-11-23 13:21:00.496 16591-16596/com.pk.tindertest I/zygote64: Increasing code cache capacity to 256KB
2019-11-23 13:22:56.359 16591-16596/com.pk.tindertest I/zygote64: Do full code cache collection, code=123KB, data=82KB
2019-11-23 13:22:56.364 16591-16596/com.pk.tindertest I/zygote64: After code cache collection, code=97KB, data=58KB
 private Context context;
      private List<Card>card;
 public CardAdapter(Context context, int textViewResourceId,List<CategoryModel>card) {
        super(context, textViewResourceId, card);
        this.context = context;
        this.card= card;
         }

        public int getCount(){
        return card.size();
    }

        public Card getItem(int position){
        return card.get(position);
    }

        public long getItemId(int position){
        return position;
         }

尝试这样做,你错过了很多东西

我认为您的代码因后台线程而无法正常工作。您获取的数据在后台 thread.They 不在主线程中。