Изменить элемент ListView во фрагменте - PullRequest
0 голосов
/ 24 ноября 2018

Я хотел бы изменить цикл for для фрагмента, содержащего карточки (как показано на рисунке), для каждого «тестового теста» TextView, чтобы он отображал, например, свою позицию в ArrayAdapter.(итак, Арно Дюбуа имеет «1» вместо «тестовый тест», Джон Сноу имеет «2» и т. д.) ...

Я настаиваю на том, что это должно быть сделано во фрагменте,а не в классе arrayadapter.

enter image description here

Кажется, я не могу получить доступ к TextView из самого фрагмента, только в классе ArrayAdapter.У меня есть некоторый код для фрагмента здесь, но элементы не меняются.Код, который должен обновлять каждый элемент, находится в «onConfirmedFriendsReceivedEvent».

public class FriendsFragment extends BaseFragment implements MaterialSearchBar.OnSearchActionListener {

ListView mFriendsList;
ConfirmedFriendsAdapter adapter;

private MaterialSearchBar searchBar;

View root_view;

public FriendsFragment(){

}

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

    root_view = view;

    initUI(view);
    initEvent(view);

    return view;
}

public static FriendsFragment newInstance(@Nullable Bundle params){
    Bundle args = (params == null) ? new Bundle() : params;
    FriendsFragment fragment = new FriendsFragment();
    fragment.setArguments(args);
    return fragment;
}

@Override
void initUI(@Nullable final View view){
    mFriendsList = view.findViewById(R.id.friends_list);
    mFriendsList.setEmptyView(view.findViewById(R.id.empty));

    searchBar = (MaterialSearchBar) root_view.findViewById(R.id.friends_searchBar);
    searchBar.setHint("Search friends...");
    //enable searchbar callbacks
    searchBar.setOnSearchActionListener(this);

}

@Override
void initEvent(@Nullable final View view){
    FriendsDataManager.getConfirmedFriends();
}

@Override
public void onSearchStateChanged(boolean enabled) {
    String s = enabled ? "enabled" : "disabled";
    Toast.makeText(getContext(), "Search " + s, Toast.LENGTH_SHORT).show();
    //if (!searchBar.isSearchEnabled()) searchBar.enableSearch();
}

@Override
public void onSearchConfirmed(CharSequence text) {
    String search = text.toString();
    FriendsDataManager.getSearchedFriends(search);
}

@Override
public void onButtonClicked(int buttonCode) {
    switch (buttonCode) {
        case MaterialSearchBar.BUTTON_NAVIGATION:
            Toast.makeText(getContext(), "Machin truc", Toast.LENGTH_SHORT).show();
            break;
        case MaterialSearchBar.BUTTON_SPEECH:
            break;
        case MaterialSearchBar.BUTTON_BACK:
            FriendsDataManager.getConfirmedFriends();
            break;
    }
}

@Subscribe
public void onConfirmedFriendsReceived(ConfirmedFriendsEvent event){
    adapter = new ConfirmedFriendsAdapter(getActivity(), event.mConfirmedFriends);
    mFriendsList.setAdapter(adapter);
    adapter.setNotifyOnChange(true);
    for(int i=0; i<adapter.getCount(); i++){
        View v = getViewByPosition(i, mFriendsList);
        TextView msg = v.findViewById(R.id.friend_message);
        msg.setText(i);
    }
}

public View getViewByPosition(int pos, ListView listView) {
    final int firstListItemPosition = listView.getFirstVisiblePosition();
    final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;

    if (pos < firstListItemPosition || pos > lastListItemPosition ) {
        return listView.getAdapter().getView(pos, null, listView);
    } else {
        final int childIndex = pos - firstListItemPosition;
        return listView.getChildAt(childIndex);
    }
}

А вот код для класса ArrayAdapter.Обратите внимание, что методы «setMail» и «getMail» недоступны (пока) из фрагмента.Я хотел бы иметь доступ к нему из фрагмента.

public class ConfirmedFriendsAdapter extends ArrayAdapter<ConfirmedFriend> {

private final List<ConfirmedFriend> mConfirmedFriends;
private final Context mContext;

private GeoDataClient geoDataClient;
private Place currentPlace;

String mail;

TextView friend_message;
TextView friend_position;

public ConfirmedFriendsAdapter(@NonNull final Context context, @NonNull final List<ConfirmedFriend> objects){
    super(context, R.layout.fragment_friends, objects);
    mConfirmedFriends = objects;
    mContext = context;
}

@NonNull
@Override
public View getView(final int position, @Nullable View convertView, @NonNull final ViewGroup parent){

    final ConfirmedFriend confirmedFriend = mConfirmedFriends.get(position);
    if(convertView == null){
        convertView = LayoutInflater.from(mContext).inflate(R.layout.item_friends_feed, parent, false);
    }

    mail = confirmedFriend.getDest_user().getMail();

    TextView friend_name = convertView.findViewById(R.id.friend_name);
    TextView friend_asl = convertView.findViewById(R.id.friend_asl);
    friend_message = convertView.findViewById(R.id.friend_message);
    friend_position = convertView.findViewById(R.id.friend_position);


    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    Date date = new Date();
    String now = dateFormat.format(date);

    try {
        Date birthdate = new SimpleDateFormat("yyyy-MM-dd").parse(confirmedFriend.getDest_user().getBirthday());
        Date nowDate = new SimpleDateFormat("yyyy-MM-dd").parse(now);
        // validate inputs ...
        DateFormat formatter = new SimpleDateFormat("yyyyMMdd");
        int d1 = Integer.parseInt(formatter.format(birthdate));
        int d2 = Integer.parseInt(formatter.format(nowDate));
        int age = (d2 - d1) / 10000;
        friend_asl.setText(confirmedFriend.getDest_user().getGender() + ", " + age);
    } catch (ParseException e) {
        e.printStackTrace();
    }

    friend_name.setText(confirmedFriend.getDest_user().getFirstName() + " " + confirmedFriend.getDest_user().getLastName());


    return convertView;

}

public String getMail() {
    return mail;
}

public void setMail(String mail) {
    this.mail = mail;
}

1 Ответ

0 голосов
/ 24 ноября 2018

Если вы хотите сделать это во фрагменте, обновите элементы списка ArrayAdapter и вызовите notifyDataSetChanged () на адаптере, который обновит список.

В вашем случае:

  1. Добавить новую переменную или использовать существующую переменную в ConfirmedFriend.
  2. Обновить эту переменную в onConfirmedFriendsReceived().
  3. После обновления списка mConfirmedFriends передать егок адаптеру.
  4. Вызовите notifyDatasetChanged() в адаптере или из фрагмента.
  5. В методе getView() вашего ArrayAdapter установите переменную ConfirmedFriend в TextView.
...