如何从另一个活动删除Recycler视图中的数据

时间:2018-06-22 04:51:44

标签: android

我有一个活动,我正在读取JSONData并在回收者视图中列出。 我已经实现了在onLongClick Listener上删除数据。 在单击“侦听器”上,我将转到该项目的“详细信息活动”。 那里我有一个标题,用于编辑标题的图像查看按钮和用于删除项目的按钮。 问题是,无论我尝试删除还是编辑标题,回到我的第一个活动时都无法正常工作。 我想我在主要活动中没有正确地将数据加载到适配器中。 但是我不怎么做得更好,有什么解决办法吗? 这是我的主要活动

public class MainActivity extends AppCompatActivity {
FloatingActionButton myFab;
ArrayList<ApiModel> mObjects = new ArrayList<>();
int i = 0;
    final String PHOTOS_URL = "http://jsonplaceholder.typicode.com/photos";
    List<ApiModel> objects = new ArrayList<>();
    private RecyclerView recyclerView;
    private MyAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myFab = findViewById(R.id.fab);
        myFab.setImageResource(R.drawable.add);            
        initRecyclerView();
        adapter.setData(mObjects);
        adapter.notifyDataSetChanged();
        //TODO: CHECK WHY NOT WORK DELETE
        checkToDeleteOrRename();
        adapter.notifyDataSetChanged();
        getJsonObjects();
        adapter.notifyDataSetChanged();
         myFab.setOnClickListener(v -> {
             Intent intent = new Intent(MainActivity.this, SendPhoto.class);
             startActivity(intent);
         });

        }

private void checkToDeleteOrRename() {

    Intent intentChange = getIntent();
    String flag = intentChange.getStringExtra(FLAG_CHANGE);
    String flagDelete = intentChange.getStringExtra(FLAG_DELETED);
    try {


        if (flag.equals(CHANGED)) {
            String oldTitle = intentChange.getStringExtra(OLD_TITLE);
            String newTitle = intentChange.getStringExtra(NEW_TITLE);
            adapter.changeUserName(oldTitle, newTitle);

        }
        if(flagDelete.equals(DELETED)) {
            String userToDelete = intentChange.getStringExtra(USER_DELETED);
            adapter.remove(userToDelete);
        }
    } catch (Exception ex) {
        return;
    }

}

private void initRecyclerView() {
    recyclerView =  findViewById(R.id.myRecyclerView);
    LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);

    adapter = new MyAdapter(this.getApplicationContext());
    recyclerView.setAdapter(adapter);

}


public void getJsonObjects() {
        AsyncHttpClient client = new AsyncHttpClient();
        client.get(PHOTOS_URL, new JsonHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
                objects = fromJson(response);
                adapter.notifyDataSetChanged();
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
                Toast.makeText(MainActivity.this, "Немате активна Интернет Конекција", Toast.LENGTH_LONG).show();
            }
        });
    }

    public ArrayList<ApiModel> fromJson(JSONArray jsonArray) {

        try {
            for (int i = 0; i < jsonArray.length(); i++) {

                try {
                    JSONObject jsonObject = jsonArray.getJSONObject(i);
                    ApiModel photoData = new ApiModel();

                    photoData.mTitle = jsonObject.getString("title");

                    photoData.Url = jsonObject.getString("url");
                    photoData.thumbnailUrl = jsonObject.getString("thumbnailUrl");
                    mObjects.add(photoData);
                    adapter.notifyDataSetChanged();


                } catch (JSONException e1) {
                    e1.printStackTrace();
                }
            }
        } catch (Exception ex) {
        }
        return mObjects;
    }
}

这是我在“第二个活动”中的删除和编辑标题方法

 public  void deleteThis(View view) {
AlertDialog.Builder builder;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    builder = new AlertDialog.Builder(this, android.R.style.Theme_Material_Dialog_Alert);
} else {
    builder = new AlertDialog.Builder(this);
}
builder.setTitle("Delete entry")
        .setMessage("Are you sure you want to delete this entry?")
        .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {

                Intent deleteIntent = new Intent(SecondActivity.this, MainActivity.class);
                deleteIntent.putExtra(FLAG_DELETED, DELETED);
                deleteIntent.putExtra(USER_DELETED, mTextView.getText().toString());
                mSecondActivity.startActivity(deleteIntent);
                Toast.makeText(mSecondActivity, "User deleted", Toast.LENGTH_SHORT).show();
            }
        })
        .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                // do nothing
            }
        })
        .setIcon(android.R.drawable.ic_dialog_alert)
        .show();

}

 public void editTitle(View view) {
DialogFragmentClass dialogFragment = new DialogFragmentClass();
dialogFragment.show(getFragmentManager(),"DIALOG");

}

这是我按标题删除并在适配器中编辑标题的方法

public void remove(String userName) {
    for (ApiModel model: data ) {
        if(model.getmTitle() .equals(userName)) {
            data.remove(model);
            notifyDataSetChanged();
        }
    }
} 
  public void changeUserName(String oldUserName, String newUsername){
    for (ApiModel model: data  ) {
        if(model.getmTitle().equals(oldUserName)){
            model.setTitle(newUsername);
            this.notifyDataSetChanged();
        }
    }
}

2 个答案:

答案 0 :(得分:0)

解决问题的一种方法是使用startActivityForResult启动Second Activity,然后根据用户对Second Activity采取的操作,将其他内容放入意图中,然后调用setResult,并在该调用下方finish(),然后您的MainActivity的onActivityResult将被调用。在onActivityResult内部,您可以调用函数checkToDeleteOrRename(Intent intent),其目的基本上是在onActivityResult内部作为参数。希望这会对您有所帮助!!

答案 1 :(得分:0)

您通过单击recyclerview中的项目转到另一个活动 使用staractivityforresult转到另一个第二活动 还可以使用put extra传递项目的位置

并使用onactivity导致设置适配器的1stctivity

从第二个活动开始,如果完成编辑或删除操作,则使用setresult返回使用putextra编辑,删除,位置参数

您将在onactivityresult的第一个活动中获得这些值

使用位置,相应地更改arraylist中的值,然后调用notifydatasetchanged