So I have a ListView which contains a checkbox and an TextView. I am successfully able to strikethrough the text on the TextView object of the ListView when it is clicked and un-strikethrough when the object is clicked again. However, when I remove an item from the ListView, the strikethrough stays statically attached to that row.
Is there a way so that the strikethrough happens on the item in the row instead of the row itself?
Here's my code:
public void onItemClick(AdapterView<?> parent, View view, int position, long id){
BucketItem item = bucketList.get(position);
TextView goal = (TextView) view.findViewById(R.id.row_text);
if(item.isDone()){
item.setDone(false);
goal.setPaintFlags(goal.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG);
}
else{
item.setDone(true);
goal.setPaintFlags(goal.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
}
listAdapter.notifyDataSetChanged();
}
public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {
new AlertDialog.Builder(this)
.setIconAttribute(android.R.attr.alertDialogIcon)
.setTitle("Confirm Delete")
.setMessage("Are you sure you want to delete this goal?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
bucketList.remove(position);
listAdapter.notifyDataSetChanged();
}
})
.setNegativeButton("No", null)
.show();
return true;
}
Adapter:
public class BucketAdapter extends ArrayAdapter<BucketItem> {
private ArrayList<BucketItem> bucketList;
private Context context;
public BucketAdapter(Context context, int textViewResourceId, ArrayList<BucketItem> bucketList) {
super(context, textViewResourceId, bucketList);
this.context = context;
this.bucketList = bucketList;
}
private class ViewHolder {
CheckBox done;
TextView goal;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
LayoutInflater vi = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = vi.inflate(R.layout.row, null);
holder = new ViewHolder();
holder.goal = (TextView) convertView.findViewById(R.id.row_text);
holder.done = (CheckBox) convertView.findViewById(R.id.row_check);
convertView.setTag(holder);
holder.done.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
CheckBox cb = (CheckBox) v;
BucketItem item = (BucketItem) cb.getTag();
item.setDone(cb.isChecked());
}
});
}
else {
holder = (ViewHolder) convertView.getTag();
}
BucketItem item = bucketList.get(position);
holder.goal.setText(item.getGoal());
holder.done.setChecked(item.isDone());
holder.done.setTag(item);
return convertView;
}
}
The paint flags should be set in your adapter's getView
method. Then, when you notifyDataSetChanged
, it can determine the state based on your backing model.
Try the below adapter and see if it helps
public class BucketAdapter extends ArrayAdapter<BucketItem> {
private ArrayList<BucketItem> bucketList;
private Context context;
public BucketAdapter(Context context, int textViewResourceId,
ArrayList<BucketItem> bucketList) {
super(context, textViewResourceId, bucketList);
this.context = context;
this.bucketList = bucketList;
}
private class ViewHolder {
CheckBox done;
TextView goal;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder = null;
if (convertView == null) {
LayoutInflater vi = (LayoutInflater) this.context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = vi.inflate(R.layout.row, null);
holder = new ViewHolder();
holder.goal = (TextView) convertView
.findViewById(R.id.row_text);
holder.done = (CheckBox) convertView
.findViewById(R.id.row_check);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.done
.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
BucketItem item = (BucketItem)getItem(position);
item.setDone(isChecked);
if (isChecked) {
holder.goal.setPaintFlags(holder.goal.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
}else{
holder.goal.setPaintFlags(holder.goal.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG);
}
}
});
BucketItem item = bucketList.get(position);
holder.goal.setText(item.getGoal());
holder.done.setChecked(item.isDone());
holder.done.setTag(item);
return convertView;
}
}
Also remove the onItemClickListener for the listview and OnItemLongClickListener should be like below
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
adapter.remove((BucketItem)parent.getItemAtPosition(position));
adapter.notifyDataSetChanged();
return false;
}
Let me know if it doesn't work.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.