Custom Recycler View Adapter - Как исключить определенные элементы? - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть специальный адаптер, который возвращает список пользователей из моей базы данных Firebase в реальном времени. Я хочу вернуть всех пользователей, кроме моих. До сих пор я пробовал:

Как исключить элемент из FirebaseRecyclerAdapter

Как скрыть элемент из Recycler View при определенном условии?

Безрезультатно.

Вот мой GridAdapter. java

public class GridAdapter extends RecyclerView.Adapter<GridAdapter.ViewHolder> {

private Context context;
private List<CustomContact> contactList;
private CircleImageView profile_picture;
private TextView user_name;
private ItemClickListener mClickListener;
private LayoutInflater mInflater;
private String[] mData;
private String mCurrent_user_id;
private DatabaseReference mDatabase;




public GridAdapter(Context context) {
    this.context = context;
    this.contactList=contactList;
    this.profile_picture=profile_picture;
    this.user_name=user_name;


}

// inflates the cell layout from xml when needed
@Override
@NonNull
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = mInflater.inflate(R.layout.mylist, parent, false);
    return new ViewHolder(view);
}

// 2
//@Override
public int getCount() {
    return contactList.size();
}

// 3
@Override
public long getItemId(int position) {
    return position;
}

// 4
//@Override
public Object getItem(int position) {
    return position;
}

// 5


public View getView(int position, View convertView, ViewGroup parent) {
    //get the user we are displaying
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.mylist, null);

    ImageView image = (ImageView) view.findViewById(R.id.friend_icon2);
    TextView friend_name = (TextView) view.findViewById(R.id.Itemname);






    //set image, username, exclude logged-in user
    mDatabase = FirebaseDatabase.getInstance().getReference();
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("users");



    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String imgURL = dataSnapshot.child("image").getValue(String.class);
            String userName = dataSnapshot.child("username").getValue(String.class);
            //set image
            Glide.with(context).load(imgURL)
                    .thumbnail(0.5f)
                    .placeholder(R.drawable.placeholder_image)
                    .error(R.drawable.placeholder_image)
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .into(image);

            //set username
            friend_name.setText(userName);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });




    return view;
}





// stores and recycles views as they are scrolled off screen
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    ImageButton myAddFriend;

    ViewHolder(View itemView) {
        super(itemView);
        myAddFriend = itemView.findViewById(R.id.add_friend); //ANIMATE IMAGEBUTTON WITH Glide
        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
        //Send friend request & Animate button with Glide
    }
}


// Binds the data to the textview in each cell
@Override
public void onBindViewHolder(ViewHolder holder, int position) {

}

// Total number of cells
@Override
public int getItemCount() {
    return mData.length;
}

// allows clicks events to be caught
void setClickListener(ItemClickListener itemClickListener) {
    this.mClickListener = itemClickListener;
}

// parent activity will implement this method to respond to click events
public interface ItemClickListener {
    void onItemClick(View view, int position);
}

}

DiscoverActivity. java

public class DiscoverFixed extends AppCompatActivity {
private EditText mSearchbar;
private ImageButton AddFriend;
private CircleImageView ProfileImg;
private TextView ItemName;
private RecyclerView rvItems;
private EndlessRecyclerViewScrollListener scrollListener;

GridAdapter adapter;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_findfriend);

    mSearchbar = (EditText) findViewById(R.id.searchbar);

    RecyclerView recyclerView = findViewById(R.id.recyclerview);
    recyclerView.setHasFixedSize(true);
    recyclerView.setNestedScrollingEnabled(false);
    recyclerView.setFocusable(false);

    GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
    recyclerView.setLayoutManager(gridLayoutManager);
    recyclerView.setAdapter(adapter);

    adapter = new GridAdapter(this);


    // Retain an instance so that you can call `resetState()` for fresh searches
    scrollListener = new EndlessRecyclerViewScrollListener(gridLayoutManager) {


        @Override
        public void onLoadMore(int page, int totalItemsCount, RecyclerView view) {
            // Triggered only when new data needs to be appended to the list
            // Add whatever code is needed to append new items to the bottom of the list
            loadNextDataFromApi(page);


        }
    };
    // Adds the scroll listener to RecyclerView
    recyclerView.addOnScrollListener(scrollListener);







}

Database

**** РЕДАКТИРОВАТЬ: Добавлено изображение базы данных и DiscoverActivity **

1 Ответ

1 голос
/ 04 мая 2020

Первое, что нужно исправить - это l oop по всем пользователям в onDataChange. Примерно так:

reference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
            String imgURL = snapshot.child("image").getValue(String.class);
            String userName = snapshot.child("username").getValue(String.class);

            Log.i("onDataChange", snapshot.getKey()+": "+imgURL+", "+userName);

            Glide.with(context).load(imgURL)
                .thumbnail(0.5f)
                .placeholder(R.drawable.placeholder_image)
                .error(R.drawable.placeholder_image)
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(image);

            friend_name.setText(userName);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException(); // never ignore errors
    }
});

Это загрузит всех пользователей, зарегистрирует их ключ + URL + имя в выводе logcat и отобразит изображение и имя конечного пользователя в представлениях.

Если вы хотите показать всех пользователей, вам необходимо:

  1. Поместить каждого пользователя в список.
  2. Убедитесь, что этот список используется адаптером.
  3. Позвоните adapter.notifyDataSetChanged(), чтобы убедиться, что адаптер знает, что список пользователей изменился.
...