Вызов метода для работы с представлением переработчика из onClick () другого класса адаптера утилизатора - PullRequest
0 голосов
/ 05 июня 2019

У меня есть фрагмент HomeFragment, на котором у него есть 2 просмотра повторов, оба из которых имеют отдельные адаптеры: 1. Чтобы показать категории (они извлекаются из API), я использую fetchCat () в HomeFragment 2. Чтобы получить фид этих категорийиспользуя http-вызов с идентификатором категории, я использую fetchFeed (categoryid) в Home Fragment;Я застрял в том, как я получу доступ к вертикальному методу реселлера, который находится в HomeFragment из категории adapter.Мне нужно знать, какая категория была нажата, с помощью которой я должен вызвать метод, который находится внутри HomeFragment.

enter image description here

public class CateogoryAdapter extends RecyclerView.Adapter<CateogoryAdapter.CateogoryViewHolder>{

List<CateogoryList> cateogoryLists;
Context context;



public CateogoryAdapter(List<CateogoryList> cateogoryLists, Context context) {
    this.cateogoryLists = cateogoryLists;
    this.context = context;

}


@NonNull
@Override
public CateogoryViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(context).inflate(R.layout.horizontal_list, viewGroup, false);

    CateogoryViewHolder cateogoryViewHolder = new CateogoryViewHolder(view);

    return cateogoryViewHolder;
}

@Override
public void onBindViewHolder(@NonNull final CateogoryViewHolder cateogoryViewHolder, int i) {

    cateogoryViewHolder.cateogrylist.setText(cateogoryLists.get(i).getCategory());

    Glide.with(context)
            .load(cateogoryLists.get(i).getImage())
            .into(cateogoryViewHolder.images);


    cateogoryViewHolder.images.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v){
            ((Home)fragment).ruleName(position);

        }
    });


}


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

public class CateogoryViewHolder extends RecyclerView.ViewHolder{
    TextView cateogrylist;
    CircleImageView images;

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

        cateogrylist = (TextView)itemView.findViewById(R.id.cateogory);
        images = (CircleImageView)itemView.findViewById(R.id.catimg);

    }
}

}

метод на HomeFragment будет вызываться

 private void fetchFeedJson(Integer startVal) {
    progressBar.setVisibility(View.GONE);

    shimmerFrameLayout.startShimmer();
    Integer studentid = PrefManager.getInstance(getContext()).getUser().getStudentid();
    Call<List<FeedList>> call = RetrofitClient
            .getInstance()
            .getApi()
            .fetchFeed(studentid, startVal);

    call.enqueue(new Callback<List<FeedList>>() {
        @Override
        public void onResponse(Call<List<FeedList>> call, Response<List<FeedList>> response) {

            List<FeedList> feed = response.body();
            feedAdapter = new FeedAdapter(feed, getContext());

            feedRecyclerView.setLayoutManager(manager);
            feedRecyclerView.setAdapter(feedAdapter);
            feedAdapter.notifyDataSetChanged();
            shimmerFrameLayout.setVisibility(View.GONE);

        }

        @Override
        public void onFailure(Call<List<FeedList>> call, Throwable t) {

            Toast.makeText(getContext(), "Some Error Occured", Toast.LENGTH_SHORT).show();
            shimmerFrameLayout.setVisibility(View.GONE);
        }
    });

}

1 Ответ

1 голос
/ 05 июня 2019

первым делом нужно объявить ваш метод fetchFeedJson как открытый

public void fetchFeedJson(Integer startVal) {
     ......
}

тогда есть несколько способов сделать это с

первый пример: внутри вашего HomeFagment

class HomeFragment extends Fragment{

    public static HomeFragment homeFragment;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_past_cycle, container, false);

        homeFragment = this;

        return view ;
    }

    public void fetchFeedJson(Integer startVal) {
        ......
    }

}

и в вашем адаптере назовите ваш метод таким образом

cateogoryViewHolder.images.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v){
        ((Home)fragment).ruleName(position);


        HomeFragment.homeFragment.fetchFeedJson(Integer.valueOf(position));

    }
});

второй пример

передать ваш домашний фрагмент в качестве параметра вашему адаптеру, как это

List<CateogoryList> cateogoryLists;
Context context;

HomeFragment homeFragment;

public CateogoryAdapter(List<CateogoryList> cateogoryLists, Context context , HomeFragment homeFragment) 
{
    this.cateogoryLists = cateogoryLists;
    this.context = context;

    this.homeFragment = homeFragment;

}

и внутри вашего слушателя:

cateogoryViewHolder.images.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v){
        ((Home)fragment).ruleName(position);

        this.homeFragment.fetchFeedJson(Integer.valueOf(position));

    }
});
...