自定义列表查看重复值并在滚动时更改它们

时间:2013-10-18 08:29:51

标签: android listview android-listview

我使用自定义适配器制作了listview。有五个文本视图,一个复选框和一个按钮。

-------------------------------------
    <TextView>  
    <TextView>   <checkbox>
    <TextView>  
    <TextView>    <button>
    <TextView>  
-------------------------------------

我用来填充列表中文本视图的arraylists具有适当的唯一数据。但是listview只需要四到五个开头的值,并在列表的其余部分重复它。

此外,当我滚动显示的值时会自动更改。例如,项目A显示在第一个位置。所以当我向下滚动然后再次出现时,会显示项目C或项目D.

这让我很困惑!请帮忙!

自定义适配器代码

protected class MyCustomAdapter extends ArrayAdapter<String>
{
    int len;
    private SparseBooleanArray mCheckStates;
    private SparseBooleanArray favourites;

    ArrayList<String> myMake, myModel, myVer, myPrice, myPlace, sellr_pos;
    int count = 0;
    ViewHolder holder = null;
    Boolean status;

    public MyCustomAdapter(Context context, int textViewResourceId,

    ArrayList<String> car_make, ArrayList<String> car_model,
            ArrayList<String> car_version, ArrayList<String> car_price,
            ArrayList<String> car_place, ArrayList<String> sellr_pos) {
        super(context, textViewResourceId);

        mCheckStates = new SparseBooleanArray(car_model.size());
        favourites = new SparseBooleanArray(car_model.size());

        myMake = car_make;
        myModel = car_model;
        myVer = car_version;
        myPrice = car_price;
        myPlace = car_place;

    }

    private class ViewHolder {
        TextView txt1, txt2, txt3, txt4, txt5;
        CheckBox chkbox;
        Button btn_fav;
    }

    @Override
    public int getCount() {
        return myMake.size();
    }

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

        if (convertView == null) {
            LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = vi.inflate(R.layout.text_adaptr, null);
            holder = new ViewHolder();

            holder.txt1 = (TextView) convertView.findViewById(R.id.text1);
            holder.txt2 = (TextView) convertView.findViewById(R.id.text5);
            holder.txt3 = (TextView) convertView.findViewById(R.id.text3);
            holder.txt4 = (TextView) convertView.findViewById(R.id.text4);
            holder.txt5 = (TextView) convertView.findViewById(R.id.text2);

            System.out.println("ListView position: " + position);

            holder.txt1.setText(myMake.get(position));
            holder.txt2.setText(myModel.get(position));
            holder.txt3.setText(myVer.get(position));
            holder.txt4.setText(myPrice.get(position));
            holder.txt5.setText(myPlace.get(position));

            holder.chkbox = (CheckBox) convertView
                    .findViewById(R.id.checkBox1);
            holder.btn_fav = (Button) convertView.findViewById(R.id.fav);

            convertView.setTag(holder);

        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.chkbox.setTag(position);

        holder.chkbox.setChecked(mCheckStates.get(position, false));

        if (favourites.get(position, false)) {

            holder.btn_fav.setBackgroundResource(R.drawable.star);


        } else {
            holder.btn_fav.setBackgroundResource(R.drawable.star_grey);

        }

        len = fav_ids.size();

        System.out.println("FAV_IDS len:" + len);

        for (int t = 0; t < len; t++) {

            String pos_id = pos.get(position).trim();
            String fav_id = fav_ids.get(t).trim();

            if (pos_id.equals(fav_id)) {


                holder.btn_fav.setBackgroundResource(R.drawable.star);

                break;

            } else {

                holder.btn_fav.setBackgroundResource(R.drawable.star_grey);
            }

        }

        holder.chkbox.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

            // Do something

            }
        });

        holder.btn_fav.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                // Do something

            }
        });

        return convertView;
    }
}

1 个答案:

答案 0 :(得分:3)

将值设置为

处的TextView
if (convertView == null) {
....code...
........../.

/*
you are setting values here
remove it from here
*/
 holder.txt1.setText(myMake.get(position));
            holder.txt2.setText(myModel.get(position));
            holder.txt3.setText(myVer.get(position));
            holder.txt4.setText(myPrice.get(position));
            holder.txt5.setText(myPlace.get(position));
}
else
{
....code...
}


/*
Set values here
it will solve the problem
*/
holder.txt1.setText(myMake.get(position));
            holder.txt2.setText(myModel.get(position));
            holder.txt3.setText(myVer.get(position));
            holder.txt4.setText(myPrice.get(position));
            holder.txt5.setText(myPlace.get(position));

它解决了我的问题