Listview项目在滚动时失去了更改

时间:2015-06-26 11:51:24

标签: android android-listview

我的需要:

我想实现一个可以包含动态no行的变量列表。 此列表包含3个TextViews,1个ImageView,3ImageButtons。

用户可以点击选择一行。长按可以选择多个项目。在选择时,将更改选定的行UI。选定项目会更改其背景和imageview图像,并且在选择时将显示一个图像按钮。

当用户点击ImageButton图像时,将更改图像按钮,其他图像按钮也会变为可见

如果已经选择了某些项目,并且用户尝试通过点击所有其他所选项目来选择单行将被删除。 listview项目应该进入原始状态。像Imageview将重置其默认图像,Imagebutton将消失。

我尝试了什么:

我尝试使用Base适配器实现ListView。定义一个自定义行,需要3个TextViews,1个ImageView和3个ImageButton。

package com.astron.myapplication;
import java.sql.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

import com.astron.myapplication.R;
import com.astron.myapplication.TSSVariableInfo;

import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TableLayout;
import android.widget.TextView;
import android.widget.ListView;
import org.w3c.dom.Text;
import android.widget.TableRow;
import android.view.View;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.Bitmap;
public class MyCustomBaseAdapter extends BaseAdapter {
    TSSVariableInfo info[];
    private LayoutInflater mInflater;

    public MyCustomBaseAdapter(Context context, TSSVariableInfo[] results) {
        info = new TSSVariableInfo[results.length];
        info = results;
        mInflater = LayoutInflater.from(context);

    }

    public int getCount() {
        return info.length;
    }

    public Object getItem(int position) {
        return info[position];
    }

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

    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;
        DateFormat dateFormatFrom ;
        DateFormat dateFormatTo;
        Boolean  IsRolSeleted = false;


        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.row, null);

            holder = new ViewHolder();
            holder.VariableCustomerGivenName = (TextView) convertView.findViewById(R.id.CustomerGivenName);
            holder.VariableStandardName =  (TextView) convertView.findViewById(R.id.StanddardName);
            holder.VariableSectionName =  (TextView) convertView.findViewById(R.id.SectionName);
            holder.VariableValue =  (TextView) convertView.findViewById(R.id.LastValue);
            holder.VariableLastDate =  (TextView) convertView.findViewById(R.id.LastDate);
            holder.VariableLegendImage = (ImageView)convertView.findViewById(R.id.ImgLegend);
            holder.VariableLegendImage.setTag(0);
            holder.BtnMore = (ImageButton)convertView.findViewById(R.id.btnMore) ;
            holder.BtnMore.setTag(0);
            holder.BtnY2 = (ImageButton)convertView.findViewById(R.id.btn2y) ;
            holder.BtnTL = (ImageButton)convertView.findViewById(R.id.btnTL) ;

            convertView.setTag(holder);
            convertView.setBackgroundColor(Color.parseColor("#E8E8E8"));

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

        }

        holder.VariableCustomerGivenName.setText(info[position].VariableCustomerGivenName);
        holder.VariableStandardName.setText(info[position].VariableStandarName);
        holder.VariableSectionName.setText(info[position].SectionName);
        holder.VariableValue.setText(info[position].Value.toString());
        dateFormatFrom = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss aa");
        dateFormatTo =  new SimpleDateFormat("MM/dd/yy");
        java.util.Date dt;
        String strdt = info[position].LastDate;

            dt = dateFormatFrom.parse(strdt);
            dateFormatTo.format(dt);
            holder.VariableLastDate.setText(dateFormatTo.format(dt));

        //holder.VariableLastDate.setText(dateFormatTo.format(dateFormatFrom.format(info[position].LastDate)));

        if(info[position].VariableCustomerGivenName.isEmpty() || info[position].VariableCustomerGivenName==null) {
            holder.VariableCustomerGivenName.setText(info[position].VariableStandarName);
            holder.VariableStandardName.setText(info[position].SectionName);
            holder.VariableSectionName.setVisibility(View.INVISIBLE);
        }
        else
            holder.VariableSectionName.setVisibility(View.VISIBLE);

        holder.BtnMore.setVisibility(View.VISIBLE);



        return convertView;
    }
    public void updateAdapter(TSSVariableInfo[] results) {
        this.info= results;

        //and call notifyDataSetChanged
        notifyDataSetChanged();
    }
    static class ViewHolder {
        TextView VariableCustomerGivenName;
        TextView VariableStandardName;
        TextView VariableSectionName;
        TextView VariableValue;
        TextView VariableLastDate;
        ImageView VariableLegendImage;
        ImageButton BtnMore;
        ImageButton BtnY2;
        ImageButton BtnTL;
    }

我的onClick

list.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {

((ImageButton)((LinearLayout) arg1).getChildAt(0).findViewById(R.id.btnMore)).setTag("1");
                    ((ImageButton)((LinearLayout) arg1).getChildAt(0).findViewById(R.id.btnMore)).setVisibility(View.VISIBLE);
                    ImageView imgLegend = ((ImageView) ((LinearLayout) arg1).getChildAt(0).findViewById(R.id.ImgLegend));
 setImageForLegend(imgLegend, info[position].VariableID);
});

遇到问题:

在滚动ListView时选择单行一些其他项目显示我为单行所做的更改。

1 个答案:

答案 0 :(得分:0)

首先,不要使用array[]使用bean类和getter setter以及ArrayList绑定ListView个项目 参考下面的链接他们如何使用SQLite数据库进行自定义ListView

http://androidtuts4u.blogspot.in/2013/02/android-list-view-using-custom-adapter.html

维护您在bean课程中设置更改所需的更改 您可能需要更改所有代码,但这只能帮助您。

我的回答可能会因为你不知道的方式而混淆。 请按照上面的链接仔细阅读并执行。