Реализация интерфейса для RecyclerView Android по элементам Click - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь создать интерактивный RecyclerView в приложении Android. В коде нет ошибок, но элементы в RecyclerView не могут быть нажаты. Элементы имеют значение true для «кликабельных» в коде XML. Я предполагаю, что проблема заключается в использовании интерфейса, так как он является относительно новым для меня. Спасибо за любую помощь.

package com.example.localmusic;

public interface OnBandVenueListener {
    void onBandVenueClick(int position);
}
----------------------------------------------------------------------------
package com.example.localmusic;

public class DisplayUserBandsVenues extends AppCompatActivity implements OnBandVenueListener {
private ActionBar actionBar;

private DatabaseReference mDatabase;
private FirebaseAuth mAuth;

private TextView bandOrVenue_textView;
private RecyclerView rvResults;

private Query band_query;
private Query venue_query;

private ArrayList<String> bands = new ArrayList<String>();
private ArrayList<String> venues = new ArrayList<String>();

private String update_band_or_venue;
private String userID;

private UserBandsVenuesAdapter mUserBandsVenuesAdapter;
private OnBandVenueListener mOnBandVenueListener;

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

    actionBar = getSupportActionBar();
    actionBar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#FF0367BE")));

    mAuth = FirebaseAuth.getInstance();
    FirebaseUser fBUser = mAuth.getCurrentUser();
    userID = fBUser.getUid();

    mDatabase = FirebaseDatabase.getInstance().getReference();
    band_query = mDatabase.child("bands");
    venue_query = mDatabase.child("venues");

    update_band_or_venue = getIntent().getStringExtra("updateWhat");

    bandOrVenue_textView = findViewById(R.id.select_textView);
    rvResults = findViewById(R.id.bands_venues_recyclerView);

    bandOrVenue();
}

public void bandOrVenue() {
    if(update_band_or_venue.equals("band")) {
        bandOrVenue_textView.setText("Select Band to Update");

        band_query.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot child : dataSnapshot.getChildren()) {
                    Band band = child.getValue(Band.class);

                    if(band.getBandAuth().equals(userID)) {
                        String band_name = band.getName();
                        bands.add(band_name);
                    }
                }

                mUserBandsVenuesAdapter = new UserBandsVenuesAdapter(bands, mOnBandVenueListener);
                rvResults.setAdapter(mUserBandsVenuesAdapter);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        });
    }
    else if(update_band_or_venue.equals("venue")) {
        bandOrVenue_textView.setText("Select Venue to Update");

        venue_query.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot child : dataSnapshot.getChildren()) {
                    Venue venue = child.getValue(Venue.class);

                    if(venue.getVenueAuth().equals(userID)) {
                        String venue_name = venue.getName();
                        venues.add(venue_name);
                    }
                }

                mUserBandsVenuesAdapter = new UserBandsVenuesAdapter(venues,  mOnBandVenueListener);
                rvResults.setAdapter(mUserBandsVenuesAdapter);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        });
    }
    else {
        bandOrVenue_textView.setText("Error!");
    }

    rvResults.setLayoutManager(new LinearLayoutManager(this));
}

@Override
public void onBandVenueClick(int position) {
    Intent intent;

    if(update_band_or_venue.equals("band")) {
        intent = new Intent(this, UpdateBandInfo.class);
    }
    else if(update_band_or_venue.equals("venue")) {
        intent = new Intent(this, UpdateVenueInfo.class);
    }
    else {
        intent = new Intent(this, DisplayUserBandsVenues.class);
    }

    startActivity(intent);
}

---------------------------------------------------------------------------------
package com.example.localmusic;


public class UserBandsVenuesAdapter extends RecyclerView.Adapter<UserBandsVenuesAdapter.ViewHolder> {
private List<String> mResults;
private OnBandVenueListener mOnBandVenueListener;

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    public TextView bandVenue_name_textView;

    OnBandVenueListener onBandVenueListener;

    public ViewHolder(View itemView, OnBandVenueListener onBandVenueListener) {
        super(itemView);

        bandVenue_name_textView = itemView.findViewById(R.id.bandVenue_name_txtView);
        this.onBandVenueListener = onBandVenueListener;

        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        onBandVenueListener.onBandVenueClick(getAdapterPosition());
    }
}

public UserBandsVenuesAdapter(List<String> results, OnBandVenueListener onBandVenueListener) {
    mResults = results;
    mOnBandVenueListener = onBandVenueListener;
}

@NonNull
@Override
public UserBandsVenuesAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
                                                          int viewType) {
    Context context = parent.getContext();
    LayoutInflater inflater = LayoutInflater.from(context);

    View userBandsVenuesView = inflater.inflate(R.layout.band_venue_list_item, parent, false);

    UserBandsVenuesAdapter.ViewHolder viewHolder = new UserBandsVenuesAdapter.
            ViewHolder(userBandsVenuesView, mOnBandVenueListener);

    return viewHolder;
}

@Override
public void onBindViewHolder(@NonNull UserBandsVenuesAdapter.ViewHolder viewHolder,
                             int position) {
    String result = mResults.get(position);

    TextView bandVenue_name_textView = viewHolder.bandVenue_name_textView;

    bandVenue_name_textView.setText(result);
}

@Override
public int getItemCount() {
    return mResults.size();
}

Дисплей с RecyclerView:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
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:background="@drawable/bluemusicoriginal"
tools:context=".DisplayUserBandsVenues">

<TextView
    android:id="@+id/select_textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="8dp"
    android:text="User Bands or Venues"
    android:textColor="#000000"
    android:textSize="30sp"
    android:textStyle="bold"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/bands_venues_recyclerView"
    android:layout_width="409dp"
    android:layout_height="680dp"
    android:layout_marginTop="8dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/select_textView" />
</androidx.constraintlayout.widget.ConstraintLayout>

Элемент списка XML:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
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:id="@+id/bandVenue_list_cl"
style="ListSeparator"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
    android:id="@+id/bandVenue_name_txtView"
    android:layout_width="307dp"
    android:layout_height="31dp"
    android:layout_marginStart="32dp"
    android:layout_marginTop="5dp"
    android:layout_marginEnd="32dp"
    android:layout_marginBottom="5dp"
    android:clickable="true"
    android:focusable="true"
    android:gravity="center"
    android:text="Band or Venue Name"
    android:textColor="#000000"
    android:textSize="30sp"
    android:textStyle="bold"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<View
    android:id="@+id/view"
    android:layout_width="match_parent"
    android:layout_height="2dp"
    android:background="#c0c0c0"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/bandVenue_list_cl" />
</androidx.constraintlayout.widget.ConstraintLayout>

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

Попробуйте это

Создайте метод интерфейса в классе адаптера

    public interface ItemClickListener {
    void onItemClick(String text, int position);
}

Затем создайте переменную ItemClickListener в классе адаптера

ItemClickListener mItemClickListener;

создайте onClickListener Метод в вашем классе адаптера

    public void onClickListener(YourAdapterName.ItemClickListener listener) {
    mItemClickListener = listener;
}

Затем в элементе onclicklistener в адаптере добавьте это

   if (mItemClickListener != null) {
            mItemClickListener.onItemClick(mData.get(position).getText(), position);
        }

Затем сделайте так, чтобы ваш класс активности реализовал YourAdapteName.ItemClickListener И установите ваш адаптер на OnclickListener следующим образом

yourAdapterName.onClickListener(this);

Когда вы реализовали ItemClickListener, вам придется переопределить onItemClick, тогда вы будете делать все, что захотите.

0 голосов
/ 10 марта 2020

Я думаю, вам просто нужно изменить эту строку

mUserBandsVenuesAdapter = new UserBandsVenuesAdapter(venues,  mOnBandVenueListener);

на

mUserBandsVenuesAdapter = new UserBandsVenuesAdapter(venues,  DisplayUserBandsVenues.this);

, потому что вы внедрили этот интерфейс в это действие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...