在添加值后从另一个活动刷新RecyclerView

时间:2019-02-19 08:49:47

标签: android android-fragments android-recyclerview

我有一个带有tabhost的MainActivitytabhost有三个tab(Fragment)。 SecondTab有一个RecyclerView。在MainActivity中,使用ActionBar按钮转到另一个活动(NewClass)并添加新值(MainActivity仍处于打开状态)。添加新值后,我想回到MainActivity并刷新RecyclerView以显示新值。 我正在使用reactToPublishedEvent()方法刷新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 :(得分:2)

我建议您使用发布者/侦听器模式。 发布者-发布一些事件。侦听器对此事件做出反应。

因此您需要创建两个接口:

interface Publisher{
void setListener(Listener listener)
}

还有

interface Listener{
void reactToPublishedEvent()
}

您的MainActivity是发布者。它发出一些事件,因此您的MainActivity应该更新:

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

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

您的SecondTab是侦听器,应更新为:

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()
        }
    }
}

答案 1 :(得分:0)

有两种方法

1。本地广播管理员

2。接口

答案 2 :(得分:0)

解决此问题的方法很少。

  1. 观察者模式。
  2. 本地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
            }
        }
    }
}

希望这会有所帮助。 干杯!