Reputation: 391
I was trying to remove a particular listitem of a recyclerview which is loaded the data from Url.
Here is my MainActivity
public class MainActivity extends AppCompatActivity {
String responseFromServer;
Button btnGetData;
RecyclerView rView;
ProgressDialog pDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnGetData = (Button)findViewById(R.id.btnGetData);
rView = (RecyclerView)findViewById(R.id.rVIew);
pDialog = new ProgressDialog(this);
pDialog.setMessage("Please Wait");
LinearLayoutManager manager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
rView.setLayoutManager(manager);
btnGetData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
refreshAdapter();
}
});
}
class PlacesTask extends AsyncTask<String,String,String>
{
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog.show();
}
@Override
protected String doInBackground(String... strings) {
WebMethods methods = new WebMethods();
responseFromServer = methods.getData();
return null;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
pDialog.dismiss();
setOutData(responseFromServer);
}
}
public void setOutData(String response)
{
ParserClass parserClass = new ParserClass();
ArrayList<PlacesData> data = parserClass.getData(response);
final MyRecyclerAdapter adapter = new MyRecyclerAdapter(MainActivity.this,data);
rView.setAdapter(adapter);
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
rView.removeViewAt(viewHolder.getAdapterPosition());
// adapter.notifyDataSetChanged();
// adapter.notifyItemRemoved(viewHolder.getAdapterPosition());
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
//adapter.notifyItemChanged(viewHolder.getAdapterPosition());
// adapter.notifyItemRemoved(viewHolder.getAdapterPosition());
}
});
itemTouchHelper.attachToRecyclerView(rView);
}
public void refreshAdapter()
{
PlacesTask task = new PlacesTask();
task.execute();
}
}
and my Adapter class is
MyRecyclerAdapter.java
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecycler> {
MainActivity activity;
LayoutInflater inflater;
ArrayList<PlacesData> data;
public MyRecyclerAdapter(MainActivity activity,ArrayList<PlacesData> data)
{
inflater = LayoutInflater.from(activity);
this.activity =activity;
this.data = data;
}
@Override
public MyRecycler onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.singleitem,null);
MyRecycler recycler = new MyRecycler(view);
return recycler;
}
@Override
public void onBindViewHolder(MyRecycler holder, final int position) {
holder.tvName.setText(data.get(position).getName());
holder.tvRating.setText(data.get(position).getRating());
Picasso.with(activity).load(data.get(position).getIcon()).into(holder.imgIcon);
holder.btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
data.remove(data.get(position));
notifyDataSetChanged();
}
});
}
@Override
public int getItemCount() {
return data.size();
}
}
While using the delete button it is working fine but by swiping it is not working it is showing empty space and the adapter is not updating properly.
I am new this swipe deletion process i was learning it so suggest me possible changes or suggest me any best approach to do this
I have swiped two list items but the space is showing.. i have tried all
adapter.notifyDataSetChanged();
adapter.notifyItemRemoved(viewHolder.getAdapterPosition());
adapter.notifyItemChanged(viewHolder.getAdapterPosition());
Upvotes: 1
Views: 472
Reputation: 2686
Remove Data from ArrayList
inside onMove()
. The use notifyDataSetChanged()
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
// rView.removeViewAt(viewHolder.getAdapterPosition());
adapter.notifyItemRemoved(viewHolder.getAdapterPosition()); //Optional .Since we uses notifyDataSetChanged()
data.remove(viewHolder.getAdapterPosition());
// adapter.notifyDataSetChanged();
// adapter.notifyItemRemoved(viewHolder.getAdapterPosition());
return false;
}
use adapter.notifyDataSetChanged();
after itemTouchHelper.attachToRecyclerView(rView)
please try this. Happy Coding
Upvotes: 2
Reputation: 391
By These Changes I got the solution
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
data.remove(data.get(viewHolder.getAdapterPosition()));
adapter.notifyDataSetChanged();
}
});
itemTouchHelper.attachToRecyclerView(rView);
adapter.notifyDataSetChanged();
Thanks for your support
Upvotes: 1
Reputation: 996
Please change below code in onSwiped method.
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
adapter.notifyItemRemoved(viewHolder.getAdapterPosition());
list.remove(position);
adapter.notifyDataSetChanged();
}
Upvotes: 1