ListView 总是从 CustomAdaptor 中删除最后一行

ListView always deletes last row from CustomAdaptor

我在 AlertDialog 中有一个 ListView,它在每一行上包含更多按钮,它会弹出一个带有删除选项的列表。当我点击删除选项时,它删除了最后一项。在 CustomAdaptor 中,我在从 ArrayList 中删除项目后尝试了 notifyDataSetChanged()。这里它总是删除最后一个项目,而不考虑项目位置。

自定义适配器代码

public class CustomAdapter extends BaseAdapter {
Context context;
List<String> lrowItems ;
ArrayList<String> listItems;
String className;
CalHelper calHelper;
Settings settings;
LayoutInflater inflter;
public CustomAdapter(Context applicationContext, ArrayList<String> listItems) {
    this.context = applicationContext;
    this.listItems = listItems;
    this.className = context.getClass().getSimpleName();
    this.calHelper  = new CalHelper(applicationContext);
    this.settings  = new Settings(applicationContext);
    inflter = (LayoutInflater.from(applicationContext));
}

@Override
public int getCount() {
    if(listItems != null) {
        return listItems.size();
    }else{
        return 0;
    }
}

@Override
public Object getItem(int position) {
    return listItems.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

//With following overrides Prevent listview item will not mix randomly
//and convertView provided is of the appropriate type.
@Override
public int getViewTypeCount() {
    if(getCount() > 0){ //for no records in returning view
        return getCount();
    }else{
        return super.getViewTypeCount();
    }
}

@Override
public int getItemViewType(int position) {
    return position;
}

/* private view holder class for holding calculation history*/
private class HistoryViewHolder {
    TextView more;
    TextView expression;
    TextView result;
    TextView shortNote;
    TextView expTime;
}

/* private view holder class for holding GST calculations history*/
private class GstHistoryViewHolder {
    TextView amount;
    TextView gst;
    TextView total;
    TextView expTime;
    ImageView share;
}

/* private view holder class */
private class BMIViewHolder {
    TextView bmiScore;
    TextView bmiDate;
    TextView bmiWeight;
}

@Override
public View getView(final int position, View convertView, ViewGroup viewGroup) {
    LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    //final int pos = position;
    if(className.equals("MainActivity")) {
        final HistoryViewHolder holder = new HistoryViewHolder();
        final String expString = listItems.get(position);
        final String expre = expString.substring(0, expString.indexOf(":"));
        final String expreTime = expString.substring(expString.indexOf(":") + 1, expString.length());
        final String result = expre.substring(expre.indexOf("=")+1);
        String timePattern = calHelper.calHistoryTimePattern(expreTime);
        SimpleDateFormat localDateFormat = new SimpleDateFormat(timePattern);

        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.listview_row, null);
            holder.more = (TextView) convertView
                    .findViewById(R.id.more);
            holder.expression = (TextView) convertView.findViewById(R.id.expression);
            holder.result = (TextView) convertView.findViewById(R.id.result);
            holder.shortNote = (TextView) convertView.findViewById(R.id.shortNote);
            holder.expTime = (TextView) convertView.findViewById(R.id.expTime);
            holder.expression.setText(expre.substring(0, expre.indexOf("=")));
            holder.result.setText(result);
            String time = localDateFormat.format(new Date(expreTime));
            holder.expTime.setText(time);
            holder.shortNote.setText(settings.getHistoryNote(context,expString));

            convertView.setTag(holder);

            final TextView btnMore = (TextView) holder.more;
            btnMore.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    showPopup(v, position, expString, expre, expreTime, holder.shortNote);
                }
            });

        }
    }


    return convertView;
}


public void showPopup(View v, final int position, final String expString, final String expression, final String expTime, final TextView shortNote) {
    final PopupMenu popup = new PopupMenu(context, v);

    //truncate title with ellipsis for more characters
    final String noteTitle = expression.length()>10? expression.substring(0, 10) + "..." : expression;
    MenuInflater inflater = popup.getMenuInflater();
    inflater.inflate(R.menu.history_menu, popup.getMenu());
    //registering popup with OnMenuItemClickListener
    popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
        public boolean onMenuItemClick(MenuItem item) {
            Intent intent = new Intent(context, MainActivity.class);
            int itenId = item.getItemId();
            switch (itenId){
                case R.id.mnuInsertExpression:
                    //some code here
                break;
                case R.id.mnuHisNote:
                    //some code here                        
                    break;
                case  R.id.mnuCopyHisRecord:
                    calHelper.copyToClipboard(expression);
                    break;
                case R.id.mnuShareHisRecord:
                    calHelper.shareText(expression);
                    break;
                case  R.id.mnuDeleteHisRecord:  //This is where I am deleting item
                    System.out.println("Pos:"+position);
                      listItems.remove(position);
                      notifyDataSetChanged();
                    Collections.reverse(listItems); //sort descending by time again
                    settings.clearSharedPre(context,expString); //remove note attached to this expression from ShredPref
                    settings.saveArrayList(context, listItems, "EXP_HISTORY");
                    intent.putExtra("HISTORY_RECORD_DELETED", true);
                    Toast.makeText(context,"Record removed from history", Toast.LENGTH_SHORT).show();
                    context.startActivity(intent);
                    break;
            }
            return true;
        }
    });
    popup.show();
}

非常感谢任何帮助。

这是因为您使用的是 getView 参数的位置,它始终是您使用它时最后一个索引的位置。

相反,您需要将该位置添加到视图中,可能在您的 convertView 中我通常会这样做(标签可以是您想要的任何内容),在创建每个视图时在您的 getView 方法中执行 convertView.setTag(position)项目视图,然后在 showpopup 中的删除方法中,您可以执行 (int)view.getTag() 以获取要从数据集中删除的位置。

您应该使用 setTag()postion 添加到 button 并使用 getTag() 将其传递给 showPopup() 时获取 position .您可以执行以下操作。

 // ....
 final TextView btnMore = (TextView) holder.more;
 btnMore.setTag(position); // here add the position to the button using setTag().
 btnMore.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
         // here you can get position your button using v.getTag().
         int pos = (int) v.getTag();
         showPopup(v, pos, expString, expre, expreTime, holder.shortNote);
    }
});

试试这个 getView():

        @Override
        public View getView(int position, View convertView, ViewGroup viewGroup) {
            HistoryViewHolder holder;
            if(className.equals("MainActivity")) {
                final String expString = listItems.get(position);
                final String expre = expString.substring(0, expString.indexOf(":"));
                final String expreTime = expString.substring(expString.indexOf(":") + 1, expString.length());
                final String result = expre.substring(expre.indexOf("=")+1);
                String timePattern = calHelper.calHistoryTimePattern(expreTime);
                SimpleDateFormat localDateFormat = new SimpleDateFormat(timePattern);

                if (convertView == null) {
                    LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
                    convertView = mInflater.inflate(R.layout.listview_row, null);
                    holder = new HistoryViewHolder();
                    holder.more = (TextView) convertView.findViewById(R.id.more);
                    holder.expression = (TextView) convertView.findViewById(R.id.expression);
                    holder.result = (TextView) convertView.findViewById(R.id.result);
                    holder.shortNote = (TextView) convertView.findViewById(R.id.shortNote);
                    holder.expTime = (TextView) convertView.findViewById(R.id.expTime);

                    holder.more.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            int pos = (int) v.getTag();
                            showPopup(v, pos, expString, expre, expreTime, holder.shortNote);
                        }
                    });
                }else{
                    holder = (HistoryViewHolder)convertView.getTag();
                }
                holder.expression.setText(expre.substring(0, expre.indexOf("=")));
                holder.result.setText(result);
                String time = localDateFormat.format(new Date(expreTime));
                holder.expTime.setText(time);
                holder.shortNote.setText(settings.getHistoryNote(context, expString));
                holder.more.setTag(position);
                convertView.setTag(holder);
            }
            return convertView;
        }

希望对您有所帮助!