列表视图中的行不保留改造并重复出现

Row in listview not preserve the makeover and appears repeated

我有一个列表,当您单击右侧的行时,带有图标的布局会被其他人更改。这很好,但是当我在列表中滚动时,我注意到有些行具有相同的图标而无需单击。另外,如果我快速滚动,这些相同的图标就会丢失并且构建方式不同。我认为这是关于细胞的重用,但我找不到解决方案。我想要的是图像仅在点击的行中保持活动状态。

谢谢!!

Adapter class:

public class ListadoVotantesArrayAdapter extends ArrayAdapter<Votante> {

    private Context context;
    private LayoutInflater inflater;
    private ArrayList<Votante> listaVotantes;
    private int rowLayout;
    private View mConverView;

    public ListadoVotantesArrayAdapter(Context context, int resource, ArrayList<Votante> objects) {
        super(context, resource,objects);
        this.context = context;
        this.inflater = LayoutInflater.from(context);
        this.listaVotantes = objects;
        this.rowLayout = resource;
    }

    public int getCount(){
        return this.listaVotantes.size();
    }

    public Votante getVotante(int position){
        return this.listaVotantes.get(position);
    }

    private static class ViewHolder {
        public TextView lblName;
        public TextView lblLastName;
        public TextView lblDni;
        public TextView lblVoterNumber;
        public RelativeLayout lytVoted;
        public RelativeLayout lytCanVote;
        public RelativeLayout lytUndo;
    }


    public View getView(int position, View converView, ViewGroup parent) {

        final ViewHolder viewHolder;
        mConverView = converView;
        if (mConverView == null){
            viewHolder = new ViewHolder();

            this.mConverView = inflater.inflate(this.rowLayout, parent, false);

            if (mConverView != null){
                viewHolder.lblName = (TextView) mConverView.findViewById(R.id.lblVoterName);
                viewHolder.lblLastName = (TextView) mConverView.findViewById(R.id.lblVoterLastName);
                viewHolder.lblDni = (TextView) mConverView.findViewById(R.id.lblDni);
                viewHolder.lblVoterNumber = (TextView) mConverView.findViewById(R.id.lblNumber);
                viewHolder.lytVoted = (RelativeLayout) mConverView.findViewById(R.id.lytVoted);
                viewHolder.lytCanVote = (RelativeLayout) mConverView.findViewById(R.id.lytCanVote);
                viewHolder.lytUndo = (RelativeLayout) mConverView.findViewById(R.id.lytUndo);
                mConverView.setTag(viewHolder);
            }
        }else{
            viewHolder = (ViewHolder) mConverView.getTag();
        }

        Votante votante = getVotante(position);

        viewHolder.lblName.setText(votante.getNombre());
        viewHolder.lblLastName.setText(votante.getApellidos());
        viewHolder.lblDni.setText(votante.getDni());
        viewHolder.lblVoterNumber.setText(""+votante.getNumVotante());

        if (votante.getVotado()){
            viewHolder.lytVoted.setVisibility(View.VISIBLE);
            viewHolder.lytCanVote.setVisibility(View.GONE);
        }else{
            viewHolder.lytVoted.setVisibility(View.GONE);
            viewHolder.lytCanVote.setVisibility(View.VISIBLE);
        }
        mConverView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewHolder.lytUndo.setVisibility(View.VISIBLE);
                notifyDataSetChanged();
            }
        });
        return mConverView;
    }
}

布局行:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/lyt_voter"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="1dp">

    <RelativeLayout
        android:id="@+id/lytVoterNumber"
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:layout_alignParentLeft="true"
        android:background="@color/lightBlueItemList">


        <TextView
            android:id="@+id/lblNumber"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:text="1999"
            android:textAppearance="?android:attr/textAppearanceMedium" />
    </RelativeLayout>

    <LinearLayout
        android:id="@+id/lytVoterData"
        android:layout_width="wrap_content"
        android:layout_height="70dp"
        android:layout_alignParentTop="true"
        android:layout_toLeftOf="@+id/lytCanVote"
        android:layout_toRightOf="@+id/lytVoterNumber"
        android:layout_toStartOf="@+id/lytCanVote"
        android:background="@color/whiteItemList"
        android:orientation="vertical"
        android:padding="5dp">

        <TextView
            android:id="@+id/lblVoterLastName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Suarez Garcia de la Serna"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <TextView
            android:id="@+id/lblVoterName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="José Carlos"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <TextView
            android:id="@+id/lblDni"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="44950962S"
            android:textAppearance="?android:attr/textAppearanceMedium" />
    </LinearLayout>

    <RelativeLayout
        android:id="@+id/lytCanVote"
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:layout_alignParentRight="true"
        android:background="@color/yellowItemList"
        android:minHeight="30dp"
        android:minWidth="30dp">

        <ImageView
            android:id="@+id/imgVote"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:src="@drawable/flecha" />

    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/lytVoted"
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:layout_alignParentRight="true"
        android:background="@color/grrenAcceptList"
        android:minHeight="30dp"
        android:minWidth="30dp"
        android:visibility="gone">

        <ImageView
            android:id="@+id/imgAccept"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:src="@drawable/aceptar"
             />
    </RelativeLayout>

    <RelativeLayout
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:minHeight="30dp"
        android:minWidth="30dp"
        android:background="@color/redD3"
        android:id="@+id/lytUndo"
        android:layout_alignParentRight="true"
        android:visibility="gone">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/imgUndo"
            android:layout_centerVertical="true"
            android:layout_centerHorizontal="true"
            android:src="@drawable/undo"/>
    </RelativeLayout>


</RelativeLayout>

你需要按照下面的思路

1) 这行代码mConverView = converView;没有意义。直接使用 converView(View from getView param). 从适配器中删除 mConvertView

2) 添加一些机制,可以告诉您单击了哪一行并保存该变量。

示例:- 有一个大小为 Rows.size 的布尔数组。并将它们设置在 onClick 中。

Boolean[] array = new Boolean[getSize()];

在您已经在 getview 中设置的 onClick 中。

public void onClick(View v) {
     array[position] = !array[position];
     viewHolder.lytUndo.setVisibility(View.VISIBLE);
     //You do not need to call notifyDatasetChange.

3) 在 getView() 中,当您将数据设置到 onClick 之前的行 items/or 时。进行如下检查。

if(array[position])// this will tell you if you need to show or hid lytUndo thing
     viewHolder.lytUndo.setVisibility(View.VISIBLE); // Show it
else 
     viewHolder.lytUndo.setVisibility(View.GONE); // hide it or do whatever you want

您可能需要将一些参数设置为最终参数

我已经尽可能简单地写了这篇文章,请反馈您的结果。