简体   繁体   English

从ListView删除项目时,TextView文本上的删除线保留

[英]Strikethrough on TextView text stays when item is removed from ListView

So I have a ListView which contains a checkbox and an TextView. 所以我有一个ListView,其中包含一个复选框和一个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. 单击列表视图时,我能够成功删除掉ListView的TextView对象上的文本,再次单击该对象时,则可以删除掉删除线。 However, when I remove an item from the ListView, the strikethrough stays statically attached to that row. 但是,当我从ListView中删除一个项目时,删除线仍保持静态连接到该行。

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. 油漆标志应在适配器的getView方法中设置。 Then, when you notifyDataSetChanged , it can determine the state based on your backing model. 然后,当您notifyDataSetChanged ,它可以根据您的支持模型确定状态。

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 同时删除列表视图的onItemClickListener,OnItemLongClickListener应该如下所示

        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. 让我知道它是否无效。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM