Как получить данные из элемента, который был нажат прослушивателем onclick - PullRequest
0 голосов
/ 07 августа 2020

У меня есть вид ресайклера, в котором много магазинов в моем приложении. каждое приложение при нажатии открывает новое действие, которое должно отображать все подробности этого c магазина.

теперь я создал прослушиватель onclick, и все работает нормально, и я даже перехожу к следующему действию, которое detailsActivity.

Моя проблема в том, как я могу передать информацию о каждом отдельном магазине в detailsActivity после того, как он был нажат в HomeActivity.

вот мой класс магазина:

private String name;
private String country;
private String address;
private String location;
private String ShopHeaderImg;
private String ShopProfileImg;
private String shopPID;

//constructor
public Shop(){

}

//constructor with parameters
public Shop(String name, String country, String address, String location, String shopHeaderImg, String shopProfileImg, String shopPID) {
    this.name = name;
    this.country = country;
    this.address = address;
    this.location = location;
    this.ShopHeaderImg = shopHeaderImg;
    ShopProfileImg = shopProfileImg;

    this.shopPID = shopPID;
}


public String getName() {
    return name;
}

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

public String getCountry() {
    return country;
}

public void setCountry(String country) {
    this.country = country;
}

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

public String getLocation() {
    return location;
}

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


public String getShopHeaderImg() {
    return ShopHeaderImg;
}

public void setShopHeaderImg(String shopHeaderImg) {
    ShopHeaderImg = shopHeaderImg;
}


public String getShopProfileImg() {
    return ShopProfileImg;
}

public void setShopProfileImg(String shopProfileImg) {
    ShopProfileImg = shopProfileImg;
}


public String getShopPID() {
    return shopPID;
}

public void setShopPID(String shopPID) {
    this.shopPID = shopPID;
}
 }

и вот моя HomeActivity:

private FirebaseFirestore firebaseFirestore;
    private RecyclerView FirestoreList;
    private FirestoreRecyclerAdapter adapter;

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


        FirestoreList = findViewById(R.id.recycler_view);
        firebaseFirestore = FirebaseFirestore.getInstance();

  Query q = firebaseFirestore.collection("Shops");

    //recycle options
    FirestoreRecyclerOptions<Shop> options = new FirestoreRecyclerOptions.Builder<Shop>()
            .setQuery(q, Shop.class)
            .build();

    adapter = new FirestoreRecyclerAdapter<Shop, ShopViewHolder>(options) {
        @NonNull
        @Override
        public ShopViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.shop_item,parent,false);
            //onclick of cardview
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Context context = v.getContext();
                    Intent intent = new Intent(context, DetailsActivity.class);
                    context.startActivity(intent);

                }
            });
            return new ShopViewHolder(view);
        }

        @RequiresApi(api = Build.VERSION_CODES.M)
        @Override
        protected void onBindViewHolder(@NonNull ShopViewHolder holder, int position, @NonNull Shop model) {
            holder.list_name.setText(model.getName());
            holder.list_location.setText(model.getLocation());
            holder.list_uid.setText(model.getShopPID());
            holder.setHeaderImage(getApplicationContext(),model.getShopHeaderImg());
            holder.list_profileImage(getApplicationContext(),model.getShopProfileImg());

    }
    };

    FirestoreList.setHasFixedSize(true);
    FirestoreList.setLayoutManager(new LinearLayoutManager(this));
    FirestoreList.setAdapter(adapter);

}

private class ShopViewHolder extends RecyclerView.ViewHolder {
    private TextView list_name;
    private TextView list_location;
    private TextView list_uid;
    private ImageView header_img;
    private ImageView list_profileImage;




    public ShopViewHolder(@NonNull View itemView) {
        super(itemView);



        list_name = itemView.findViewById(R.id.list_name);
        list_location = itemView.findViewById(R.id.list_location);
        list_uid = itemView.findViewById(R.id.list_uid);
        header_img = itemView.findViewById(R.id.header_img);
        list_profileImage = itemView.findViewById(R.id.list_profileImage);

    }

    public void setHeaderImage(final Context c , final String Image) {
        final ImageView headerImg = (ImageView)itemView.findViewById(R.id.header_img);
        Picasso.get().load(Image).into(headerImg);

    }
    public void list_profileImage(final Context c , final String image) {
        final ImageView profileImg = (ImageView)itemView.findViewById(R.id.list_profileImage);
        Picasso.get().load(image).into(profileImg);

    }
}

@Override
public void onStart() {
    super.onStart();
    adapter.startListening();
}

@Override
public void onStop() {
    super.onStop();
    adapter.stopListening();
}

это моя DetailsActivity:

public class DetailsActivity extends AppCompatActivity {


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


    }
}

теперь, когда я нажимаю на любую из карточек или изображений магазинов, открывается Подробности Моя проблема заключается в том, как получить эту информацию о магазинах c в новые подробности активности из БД, такие как имя, местоположение, адрес и т. д. c.

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Nidhes sh имеет право попросить вас переместить onCLickListener в onBindViewHolder, но я бы сделал это следующим образом:

    @RequiresApi(api = Build.VERSION_CODES.M)
        @Override
        protected void onBindViewHolder(@NonNull ShopViewHolder holder, int position, @NonNull Shop model) {
            holder.list_name.setText(model.getName());
            holder.list_location.setText(model.getLocation());
            holder.list_uid.setText(model.getShopPID());
            holder.setHeaderImage(getApplicationContext(),model.getShopHeaderImg());
            holder.list_profileImage(getApplicationContext(),model.getShopProfileImg());

//add this lines
holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                   
                    Intent intent = new Intent(context, DetailsActivity.class);
                    intent.putExtra("shopModel", model);
                    context.startActivity(intent);

                }
            });
    

Сделайте свой класс Shop реализуемым Serializable, например:

    public class Shop implements Serializable { 
...
//all remains the same in that class
 }

После в поле DetailsActivity напишите это, чтобы получить выбранную модель магазина:

Shop shopModel = getIntent().getSerializableExtra("shopModel");
0 голосов
/ 07 августа 2020

прежде всего создайте setOnClickListener в onBindViewHolder

 holder.list_name..setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                   
                    Shop shopmodel= shoparray.get( holder.getAdapterPosition());
                    Intent intent = new Intent(context, DetailsActivity.class);
                    intent.putExtra("keyName", shopmodel.getName());
                    context.startActivity(intent);

                }
            });

для получения значений в деталях активности

 Bundle extras = intent.getExtras();
    if(extras != null)
    String data = extras.getString("keyName");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...