У меня есть этот метод во фрагменте
public void setOnItemClickListener(OnItemClickListener listener){
mListener = listener;
}
и мне нравится использовать этот метод в другом фрагменте, так
listImageAdapter.setOnItemClickListener(context);
но я получил ошибку, потому что параметр OnItemClickListener, и я смотрю на учебник, они использовали его вот так, потому что они использовали его в Activity, а не во фрагменте
mAdapter.setOnItemClickListener(ImagesActivity.this);
Итак, как я могу это решить?
ниже мой полный код
Фрагмент списка
public class ListFragment extends BaseFragment implements ListImageAdapter.OnItemClickListener {
public static final String TAG = "ListFragment";
private RecyclerView recyclerViewImages;
private DatabaseReference databaseReference;
private Context context;
private List<Model> mModel;
private ListImageAdapter listImageAdapter;
private Variable staticVariable = new Variable();
public ListFragment() {
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_list_batik, container, false);
findView(view);
initView(view);
initListener(view);
getDataFromFirebase();
return view;
}
private void getDataFromFirebase() {
recyclerViewImages.setHasFixedSize(true);
recyclerViewImages.setLayoutManager(new LinearLayoutManager(context));
mModel = new ArrayList<>();
databaseReference = FirebaseDatabase.getInstance().getReference(staticVariable.BATIK_DETECTIONS);
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot postSnapshot : dataSnapshot.getChildren()){
Model model = postSnapshot.getValue(Model.class);
mModel.add(model);
}
listImageAdapter = new ListImageAdapter(context, mModel);
listImageAdapter.setOnItemClickListener(context); // this is where i got an error
recyclerViewImages.setAdapter(listImageAdapter);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
simpleActivity.toastMessage(context, databaseError.getMessage());
}
});
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.context = context;
}
@Override
public void findView(View view) {
recyclerViewImages = view.findViewById(R.id.recycleview_image);
}
@Override
public void initView(View view) {
}
@Override
public void initListener(View view) {
}
@Override
public void OnItemClick(int position) {
}
@Override
public void OnViewDescriptions(int position) {
}
@Override
public void OnEditItem(int position) {
}
}
Адаптер списка изображений
public class ListImageAdapter extends RecyclerView.Adapter<ListImageAdapter.ImageViewHolder> {
private Context context;
private List<Model> mModels;
private OnItemClickListener mListener;
public ListImageAdapter(Context context, List<Model> mModels) {
this.context = context;
this.mModels = mModels;
}
@NonNull
@Override
public ImageViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int position) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_images, viewGroup, false);
return new ImageViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ImageViewHolder imageViewHolder, int position) {
Model model = mModels.get(position);
imageViewHolder.textView.setText(model.getImageNames());
Picasso.get()
.load(model.getImagesUri())
.placeholder(R.mipmap.ic_launcher)
.fit()
.centerCrop()
.into(imageViewHolder.imageView);
}
@Override
public int getItemCount() {
return mModels.size();
}
class ImageViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener,
View.OnCreateContextMenuListener, MenuItem.OnMenuItemClickListener {
private ImageView imageView;
private TextView textView;
public ImageViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.tv_images_name);
imageView = itemView.findViewById(R.id.list_images);
itemView.setOnClickListener(this);
itemView.setOnCreateContextMenuListener(this);
}
@Override
public boolean onMenuItemClick(MenuItem item) {
if (mListener != null) {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
switch (item.getItemId()) {
case 1:
mListener.OnViewDescriptions(position);
return true;
case 2:
mListener.OnEditItem(position);
return true;
}
}
}
return false;
}
@Override
public void onClick(View v) {
if (mListener!=null){
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION){
mListener.OnItemClick(position);
}
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
menu.setHeaderTitle("Select Actions");
MenuItem ViewDescribtions = menu.add(Menu.NONE, 1, 1, "Lihat Deskripsi");
MenuItem Edit = menu.add(Menu.NONE, 2, 2, "Edit");
ViewDescribtions.setOnMenuItemClickListener(this);
Edit.setOnMenuItemClickListener(this);
}
}
public interface OnItemClickListener{
void OnItemClick(int position);
void OnViewDescriptions(int position);
void OnEditItem(int position);
}
public void setOnItemClickListener(OnItemClickListener listener){
mListener = listener;
}
}
пользовательские интерфейсы или локальные широковещательные приемники
Контекст @PPartisan, который вы имеете в виду в моем коде? частный контекст контекста; я не использую его в классе, я думал, что этого будет достаточно, потому что он даст мне getApplicationContext, должен ли я его изменить?
я ненавижу такого рода комментарии @Ashish вместо того, чтобы помочь мне, просто публикую другую ссылку, не имеющую отношения к моим вопросам, и когда я смотрю на вопросы, эти вопросы совершенно разные, мне нужно, как я могу получить контекст на фрагменте как выше, что я уже объясняю
Извините, сэр, это был неправильный клик
Ваш интерфейс,
interface ItemClickListener {
fun onItemClick(position: Int)
}
Ваш класс адаптера,
public class InnerAdapter extends RecyclerView.Adapter<InnerAdapter.InnerViewHolder> {
private Context context;
private ItemClickListener listener;
public InnerAdapter(Context context, ItemClickListener listener) {
this.context = context;
this.listener = listener;
}
@NonNull
@Override
public InnerAdapter.InnerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View holder = LayoutInflater.from(context)
.inflate(R.layout.item_inneradapter, viewGroup, false);
return new InnerViewHolder(holder);
}
@Override
public void onBindViewHolder(@NonNull InnerViewHolder innerViewHolder, final int i) {
innerViewHolder.textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onItemClick(i);
}
});
}
@Override
public int getItemCount() {
return 20;
}
class InnerViewHolder extends RecyclerView.ViewHolder {
public TextView textView;
public InnerViewHolder(View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.textView);
}
}
}
Ваша активность,
class NestedRecyclerActivity : AppCompatActivity() ,ItemClickListener{
override fun onItemClick(position: Int) {
Log.e("yourItemClickPosition :", "" + position)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_nested_recycler)
recyclerOuter.layoutManager = LinearLayoutManager(
this, LinearLayoutManager.VERTICAL, false
)
recyclerOuter.isNestedScrollingEnabled = false
val adapter = InnerAdapter(this,this)
recyclerOuter.adapter = adapter
}
}
Должен ли я изменить public void в моем коде на интерфейс? если я это сделаю, у меня появится ошибка в моем ImageAdapter, я отредактирую свои вопросы и вставлю весь свой полный код
Нет, вы не можете изменить его, потому что это интерфейс, а не функция.
Если контекст определен так
Context context;
...
...
context = this;
Тогда это не должно работать, потому что setOnItemClickListener ждет ListFragment урок, а не Context.
Если вы установите его в onCreateView вашего фрагмента, вы можете сделать это так:
listImageAdapter.setOnItemClickListener(this);
Или
listImageAdapter.setOnItemClickListener(ListFragment.this);
setOnItemClickListener() определяется здесь:
public void setOnItemClickListener(OnItemClickListener listener){
mListener = listener;
}
Но вы передаете здесь аргумент Context, когда ему нужен OnItemClickListener.
listImageAdapter.setOnItemClickListener(context);
Ваш фрагмент реализует это interface:
public class ListFragment extends BaseFragment implements ListImageAdapter.OnItemClickListener
Таким образом, вы можете просто передать this в качестве аргумента (где this относится к текущему экземпляру фрагмента):
listImageAdapter.setOnItemClickListener(this);
я не могу использовать это, потому что это дает мне ошибку, не может быть применено к firebase.EventValueListener
Какой класс
contextв вашем примере?setOnItemClickListenerтребуетсяOnItemClickListener. Кроме того, взаимодействие между фрагментами не так просто, как наличие ссылки на представление в другом фрагменте.