обновить RecyclerView из другого занятия после добавления значения - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть MainActivity с tabhost, tabhost имеет три вкладки (Fragment).SecondTab имеет RecyclerViewMainActivity используйте кнопку ActionBar, чтобы перейти к другому действию (NewClass) и добавить новые значения (MainActivity по-прежнему открыта).После добавления новых значений я хочу вернуться к MainActivity и обновить RecyclerView для отображения новых значений.Я использую responseToPublishedEvent () метод, чтобы обновить RecyclerView, но не работает.Я не смог решить свою проблему с помощью ответов.

MainActivity

public class MainActivity extends AppCompatActivity implements Publisher{
private Listener listener;
protected void onCreate(Bundle savedInstanceState) {
//. . .

public void onClick(View view)
{
    Intent intent = new Intent();

    intent.setClass(this , NewClass.class);

    startActivityForResult(intent , 1);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode == 1 && resultCode == RESULT_OK)
    {
        if(data != null)
        {
             listener.reactToPublishedEvent();
        }
    }
}

@Override
public void setListener(SecondTab listener) {
    this.listener = listener;
}

interface Listener{
    void reactToPublishedEvent();
}}

NewClass

boolean check = database.SaveClass(className, classDay, classTimeStart, classTimeEnd, Integer.parseInt(classNumber), uniName , checkMidTerm , checkEndTerm , checkPractical , checkProject , checkConference);

if(check)
{
    Intent intent = new Intent();

    setResult(RESULT_OK , intent);

    finish();
}

SecondTab:

public class SecondTab extends Fragment implements MainActivity.Listener{

private RecyclerView recyclerView;

private DatabaseHandler database;

private RecyclerViewAdapter recyclerAdapter;

private List<ClassTable> classData;

@Nullable
@Override
public View onCreateView(final LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.activity_second_tab, container, false);

    database = new DatabaseHandler(getContext());

    recyclerView = view.findViewById(R.id.recyclerView_SecondTab);

    classData = new ArrayList<>();

    prepareAdapter();

    return view;
}

private void prepareAdapter()
{
    classData = database.getClassData();//Receive table data

    recyclerAdapter = new RecyclerViewAdapter(this , getContext(), classData);

    recyclerView.setAdapter(recyclerAdapter);

    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
}

    @Override
public void onAttach(Context context) {
    super.onAttach(context);

    if(context instanceof Publisher){
        ((Publisher)context).setListener(this);
    }
}

@Override
public void reactToPublishedEvent() {
    recyclerAdapter.notifyDataSetChanged();//this line is not correct
}

Издатель

public interface Publisher {
void setListener(SecondTab listener);}

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Есть два способа

1. Менеджер локального вещания

2. Интерфейс

0 голосов
/ 19 февраля 2019

Мало способов решить проблему.

  1. Шаблон наблюдателя.
  2. Local BroadcastManager.
  3. Непосредственное обновление из фрагмента.

Первый и второй методы уже описаны в ответах выше.Так что опишу третий.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode == 1 && resultCode == RESULT_OK)
    {
        if(data != null)
        {
            Fragment fragment  = getSupportFragmentManager().findFragmentById(R.id.fragment);
            if (fragment instanceof SecondTab)
            {
                 ((SecondTab)fragment).recyclerView.notifyDataSetChanged();
                 // Any Notify method as the requirement
            }
        }
    }
}

Надеюсь, это поможет.Ура !!

0 голосов
/ 19 февраля 2019

Я рекомендую вам использовать шаблон Publisher / Listener.Издатель - опубликуйте какое-нибудь событие.Слушатель реагирует на эти события.

Поэтому вам нужно создать два интерфейса:

interface Publisher{
void setListener(Listener listener)
}

И

interface Listener{
void reactToPublishedEvent()
}

Ваша основная деятельность - издатель.Он генерирует некоторые события, поэтому ваша MainActivity должна быть обновлена:

class MainActivity extends AppCompatActivity implements Publisher{
private Listener listener;
... // Some your code here

@Ovveride
public void setListener(Listener listener){
this.listener = listener
}
}

Ваш SecondTab является Listener и должен быть обновлен как:

public class SecondTab extends Fragment implements AlertDialogShowClass.OnItemChange, Listener{
... //Your code here
@Ovveride
public void onAttach(Context context){
//Set this fragment in activity as Listener
if(context instance of Publisher){
    ((Publisher)context).setListener(this)
}
}
}

Затем в методе onActivityResult вы можете написать что-то вроде этого:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode == 1 && resultCode == RESULT_OK)
    {
        if(data != null && listener!=null)
        {
             listener.reactToPublishedEvent()
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...