сообщить фрагменту, когда определенный элемент списка отображается на экране - PullRequest
0 голосов
/ 19 мая 2018

У меня есть фрагмент, который содержит ListView с пользовательским ArrayAdapter.Я хотел бы запустить определенный метод во фрагменте, когда определенные элементы в ArrayList прокручиваются и отображаются через getView().

. Есть ли способ заставить мой пользовательский ArrayAdapter вызывать метод непосредственно из фрагментаобъект, который создал это?Или есть способ прослушивания фрагмента для определенного элемента массива?

Вот мой фрагмент кода, который создает экземпляр ArrayAdapter:

private void initAdapter() {
    infoViewAdapter infoAdapter = new infoViewAdapter(getActivity(), myInfo);

    infoListView = rootView.findViewById(R.id.list);

    infoListView.setAdapter(infoAdapter);
}

А вот getView() вмой пользовательский адаптер:

public View getView(int position, View convertView, @NonNull ViewGroup parent) {
    View listItem = convertView;
    if(listItem == null) {
        listItem = LayoutInflater.from(myContext).inflate(R.layout.piece_of_info, parent, false);
    }

    myInfo currentInfo = getItem(position);

    TextView infoWordsText = listItem.findViewById(R.id.infoWordsView);
    TextView infoGotoText = listItem.findViewById(R.id.infoGoto);

    ImageView infoImage = listItem.findViewById(R.id.infoImageView);
    if (currentInfo.pic != -1) {
        // info block
        infoWordsText.setVisibility(View.VISIBLE);
        infoImage.setVisibility(View.VISIBLE);
        infoGotoText.setVisibility(View.GONE);

        infoWordsText.setText(currentInfo.words);
        infoImage.setImageResource(currentInfo.pic);
    } else {
        // category header
        infoWordsText.setVisibility(View.GONE);
        infoImage.setVisibility(View.GONE);
        infoGotoText.setVisibility(View.VISIBLE);

        infoGotoText.setText(currentInfo.words);

        // HERE I WOULD LIKE TO CALL A METHOD ON THE FRAGMENT THAT CREATED ME
        // OR HAVE THE FRAGMENT REALIZE A CERTAIN ARRAY ELEMENT HAS BEEN DISPLAYED
    }

    return listItem;
}

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Я не мог заставить обратный вызов, который Мэн показал мне, чтобы работать ... это сейчас немного выше моих знаний Java, но я смог заставить подход, предложенный в комментариях Каран Моди, работать.В дополнение к контексту активности, который мой код уже передал в мой пользовательский конструктор ArrayAdapter, я также включил ссылку на сам экземпляр фрагмента:

infoViewAdapter infoAdapter = new infoViewAdapter(getActivity(), myInfo, this);

и мой конструктор:

infoViewAdapter(Context context, ArrayList<MordorInfo> list, FeaturedFragment cb) {
    super (context, 0, list);
    myContext = context;
    infoList = list;
    featuredCallback = cb;
}

а затем вызвать метод фрагмента:

if (featuredCallback != null) {
    featuredCallback.setButtonCallback(currentInfo.gotoRef);
}

Работает как шарм.Есть ли недостатки у этого подхода?

0 голосов
/ 19 мая 2018

Вы можете использовать обратный вызов.

public interface OnGetView {
   void execute(int position);
}

Создайте пользовательский адаптер, расширяющий ArrayAdapter:

public class CustomAdapter extends ArrayAdapter {
    private OnGetView callback;

    public CustomAdapter(Context context, int resource, List<T> objects, OnGetView callback) {
       super(context, resource, objects);
       this.callback = callback;
    }

    @Override
    public View getView(..) {
       process...
       callback.execute(position); // Should use thread here to not block ui thread if your callback is long-running task
    }
}

При инициализации адаптера передайте обратный вызов через этот конструктор, и выset.

// In your fragment
OnGetView myCallback = new OnGetView() {
    @Override
    void execute(int position) {
       ... your logic
    }
};

или

OnGetView myCallback = () -> { your logic};

Затем передайте его своему адаптеру массива:

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