Java Android ListView:修改一行会影响其他行

Java Android ListView:修改一行会影响其他行,java,android,listview,adapter,Java,Android,Listview,Adapter,我目前正在制作一个包含ListView的活动,其中ImageView作为复选框,如果用户点击该行的ImageView,该复选框将更改。问题是,当选择一行修改其ImageView时,但在浏览了几行(准确地说是8行)之后,我发现这一行的ImageView也被修改了 以下是一些相关代码: HistoryRowAdapter.java @Override public View getView(int position, View convertView, ViewGroup paren

我目前正在制作一个包含ListView的活动,其中ImageView作为复选框,如果用户点击该行的ImageView,该复选框将更改。问题是,当选择一行修改其ImageView时,但在浏览了几行(准确地说是8行)之后,我发现这一行的ImageView也被修改了

以下是一些相关代码:

HistoryRowAdapter.java

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

    if (convertView == null) {
        LayoutInflater theInflater = LayoutInflater.from(getContext());
        convertView = theInflater.inflate(R.layout.history_row, parent, false);
        convertView.setTag(getItemId(position));
    }

    final Operation currentOperation = getItem(position);
    //Log.d("KS", "Name: " + currentOperation.toString());

    DBTools db = new DBTools(getContext());
    HashMap<String,String> patientData = db.getPatientData(currentOperation.getId());

    String patientName = "N/A";
    if (Integer.parseInt(patientData.get("id")) != -1){
        //Patient Data was entered

        String lastName = patientData.get("last_name");
        String firstName = patientData.get("first_name");
        patientName = lastName.length()!=0 && firstName.length()!=0 ? lastName+", "+firstName.charAt(0): "N/A";
    }

    TextView nameTextView = (TextView) convertView.findViewById(R.id.nameFieldTextView);
    nameTextView.setTextColor(Color.WHITE);
    nameTextView.setText(patientName);

    String[] dateTime = currentOperation.getDatetime().split("_");

    TextView dateTextView = (TextView) convertView.findViewById(R.id.dateFieldTextView);
    dateTextView.setTextColor(Color.WHITE);
    dateTextView.setText(dateTime[0]);

    dateTime[1] = dateTime[1].replace("-",":");
    TextView timeTextView = (TextView) convertView.findViewById(R.id.timeFieldTextView);
    timeTextView.setTextColor(Color.WHITE);
    timeTextView.setText(dateTime[1]);

    final ProgressDialog loading = new ProgressDialog(context);
    loading.setMessage("Loading Procedure...");
    loading.setCancelable(false);
    loading.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    Button viewOperationButton = (Button) convertView.findViewById(R.id.viewOperationButton);
    viewOperationButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(context, ReviewMode.class);
            i.putExtra("selectedOperation",currentOperation.getId());
            i.putExtra("deviceStatus",0);
            loading.show();
            context.startActivity(i);
        }
    });

    /*ImageView checkedImageView = (ImageView) theView.findViewById(R.id.checkedImageView);
    for (int i = 0; i< itemsSelected.size(); i++){
        if(position == itemsSelected.get(i)){
            checkedImageView.setImageResource(R.drawable.selected_row);
        }
    }*/


    return convertView;
}
@覆盖
公共视图getView(int位置、视图转换视图、视图组父视图){
if(convertView==null){
LayoutInflater theInflater=LayoutInflater.from(getContext());
convertView=inflater.flate(R.layout.history\u行,父级,false);
setTag(getItemId(position));
}
最终操作currentOperation=getItem(位置);
//Log.d(“KS”,“Name:”+currentOperation.toString());
DBTools db=newdbtools(getContext());
HashMap patientData=db.getPatientData(currentOperation.getId());
字符串patientName=“不适用”;
if(Integer.parseInt(patientData.get(“id”))!=-1){
//输入患者数据
字符串lastName=patientData.get(“last_name”);
String firstName=patientData.get(“first_name”);
patientName=lastName.length()!=0&&firstName.length()!=0?lastName+,“+firstName.charAt(0):“不适用”;
}
TextView名称TextView=(TextView)convertView.findViewById(R.id.nameFieldTextView);
nameTextView.setTextColor(Color.WHITE);
nameTextView.setText(patientName);
字符串[]dateTime=currentOperation.getDatetime().split(“”);
TextView dateTextView=(TextView)convertView.findViewById(R.id.dateFieldTextView);
dateTextView.setTextColor(Color.WHITE);
dateTextView.setText(dateTime[0]);
dateTime[1]=dateTime[1]。替换(“-”,“:”);
TextView timeTextView=(TextView)convertView.findViewById(R.id.timeFieldTextView);
timeTextView.setTextColor(Color.WHITE);
timeTextView.setText(dateTime[1]);
最终ProgressDialog加载=新建ProgressDialog(上下文);
加载.setMessage(“加载过程…”);
加载。可设置可取消(false);
加载.setProgressStyle(ProgressDialog.STYLE\u微调器);
按钮视图操作按钮=(按钮)convertView.findViewById(R.id.viewOperationButton);
viewOperationButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
意图i=新意图(上下文,ReviewMode.class);
i、 putExtra(“selectedOperation”,currentOperation.getId());
i、 putExtra(“设备状态”,0);
loading.show();
背景。起始触觉(i);
}
});
/*ImageView checkedImageView=(ImageView)theView.findViewById(R.id.checkedImageView);
对于(int i=0;i
“检查”行的函数:

公共视图getViewByPosition(int位置,ListView ListView){ final int firstListItemPosition=listView.getFirstVisiblePosition(); final int lastListItemPosition=firstListItemPosition+listView.getChildCount()-1; if(位置lastListItemPosition){ 返回listView.getAdapter().getView(位置,null,listView); }否则{ final int childIndex=位置-firstListItemPosition; 返回listView.getChildAt(childIndex); } } 公共无效按钮选择(){ 如果(this.highlightedIndex!=-1){ int firstRow=proceduresListView.getFirstVisiblePosition(); int lastRow=proceduresListView.getLastVisiblePosition(); 日志d(“KS”,“第一行:”+第一行); Log.d(“KS”,“最后一行:”+lastRow); //RelativeLayout highlightedRow=(RelativeLayout)ProcedureListView.getChildAt(ProcedureListView.GetCheckEditePosition()%7); Log.d(“KS”,“Checked:”+proceduresListView.getCheckedItemPosition()); RelativeLayout highlightedRow=(RelativeLayout)getViewByPosition(ProcedureListView.GetCheckEditePosition(),ProcedureListView); Log.d(“KS”,“Selected:”+this.highlightedIndex); ImageView checkboxRow=(ImageView)highlightedRow.findViewById(R.id.checkedImageView); if(selectedItems.contains(this.highlightedIndex)){ Log.d(“KS”,“Items:+selectedItems.toString()); checkboxRow.setImageResource(R.drawable.normal_行); //选择editems.remove(this.highlightedIndex); selectedItems.remove(selectedItems.indexOf(this.highlightedIndex)); }否则{ checkboxRow.setImageResource(R.drawable.selected_行); 选择editems.add(this.highlightedIndex); Log.d(“KS”,“Items:+selectedItems.toString()); } checkedCountTextView.setText(selectedItems.size()+); //Log.d(“KS”,“Select:”+高亮显示索引); //Log.d(“KS”,“Items:+selectedItems.toString()); } }
使用
public View getViewByPosition(int position, ListView listView) {
    final int firstListItemPosition = listView.getFirstVisiblePosition();
    final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;

    if (position < firstListItemPosition || position > lastListItemPosition ) {
        return listView.getAdapter().getView(position, null, listView);
    } else {
        final int childIndex = position - firstListItemPosition;
        return listView.getChildAt(childIndex);
    }
}

public void buttonSelect(){
    if (this.highlightedIndex != -1){
        int firstRow = proceduresListView.getFirstVisiblePosition();
        int lastRow = proceduresListView.getLastVisiblePosition();
        Log.d("KS","First Row: "+firstRow);
        Log.d("KS","Last Row: "+lastRow);
        //RelativeLayout highlightedRow = (RelativeLayout) proceduresListView.getChildAt(proceduresListView.getCheckedItemPosition()%7);
        Log.d("KS","Checked:"+proceduresListView.getCheckedItemPosition());
        RelativeLayout highlightedRow = (RelativeLayout) getViewByPosition(proceduresListView.getCheckedItemPosition(), proceduresListView);
        Log.d("KS","Selected:"+this.highlightedIndex);
        ImageView checkboxRow = (ImageView) highlightedRow.findViewById(R.id.checkedImageView);

        if (selectedItems.contains(this.highlightedIndex)){
            Log.d("KS","Items: "+selectedItems.toString());
            checkboxRow.setImageResource(R.drawable.normal_row);
            //selectedItems.remove(this.highlightedIndex);
            selectedItems.remove(selectedItems.indexOf(this.highlightedIndex));
        } else {
            checkboxRow.setImageResource(R.drawable.selected_row);
            selectedItems.add(this.highlightedIndex);
            Log.d("KS","Items: "+selectedItems.toString());
        }

        checkedCountTextView.setText(selectedItems.size()+"");
        //Log.d("KS", "Select: " + highlightedIndex);
        //Log.d("KS","Items: "+selectedItems.toString());
    }
}