ListView行中的TextView在Android中显示滚动时重复的值? [英] TextView in listview rows showing repeated values on scroll in Android?

查看:77
本文介绍了ListView行中的TextView在Android中显示滚动时重复的值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用ListView的自定义适配器,其中有一个TextView和一个Spinner.从微调器中选择值后,将值复制到相应的同一行列表的TextView中.

I am working with custom Adapter of a ListView in which I have a TextView and a Spinner. After selecting the values from a Spinner, the value after copied to the TextView of the respective same Row of list.

问题是,由于ListView中有40多个元素,因此当我选择第一个微调器并将其值设置为相应的TextView时,在滚动时,在第十行TextView中将看到相同的值.

Problem is, As I have more than 40 elements in the ListView , when I select the first spinner and set the value to the respective TextView, on scroll, the same value is seen in the 10th Row TextView.

将值从滚动中的第1个TextView复制到第10个TextView.

Values are copied from 1st TextViewto 10th TextView on scroll.

下面是我正在使用的代码:

Below is the code which I am using:

public class AppListAdapter extends BaseAdapter {

    private LayoutInflater mInflater;
    private List<App> mApps = Constants.list;
    private Context _activity;
    ArrayList<String> months=null;
    ArrayAdapter<String> dataAdapter =null;
    int spinerposition;
    int viewposition;

    int temp=0;
    private int screenWidth;


    /**
     * Constructor.
     * 
     * @param context the application context which is needed for the layout inflater
     * @param screenWidth 
     */
    public AppListAdapter(Context context, int screenWidth) {
        // Cache the LayoutInflate to avoid asking for a new one each time.
        mInflater = LayoutInflater.from(context);
        this._activity=context;
        this.screenWidth = screenWidth;

        months = new ArrayList<String>();
        months.add("No Item Selected");
        months.add("None");
        months.add("Entertainment");
        months.add("Games");
        months.add("News/Books");
        months.add("Social Networking");
        months.add("Utilities");
        months.add("Texting");
        months.add("Web Browsers");


        // Creating adapter for spinner
        dataAdapter = new ArrayAdapter<String>(_activity,
                android.R.layout.simple_spinner_item, months);

        // Drop down layout style - list view with radio button
        dataAdapter.setDropDownViewResource(android.R.layout.select_dialog_singlechoice);


    }

    public int getCount() {

        return mApps.size();
    }

    public Object getItem(int position) {
        return mApps.get(position);
    }

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

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

        final AppViewHolder holder;

        viewposition=position;
        if(convertView == null) {
            convertView = mInflater.inflate(R.layout.row, null);
            // creates a ViewHolder and stores a reference to the children view we want to bind data to
            holder = new AppViewHolder();

            holder.spiner=(Spinner)convertView.findViewById(R.id.spinner);
            holder.offtext=(TextView)convertView.findViewById(R.id.off_txt);


            holder.offTxt = (TextView) convertView.findViewById(R.id.off_txt);
            holder.apptitleTxt = (TextView) convertView.findViewById(R.id.apptitle_txt);
            Typeface typeface = Typeface.createFromAsset(_activity.getAssets(),"CHICM___.TTF");
            holder.apptitleTxt.setTypeface(typeface);
            holder.offTxt.setTypeface(typeface);

            if(screenWidth>480){
                holder.offTxt.setTextSize(30);
                holder.apptitleTxt.setTextSize(30);
            }
            convertView.setTag(holder);
        } else { 
            holder = (AppViewHolder) convertView.getTag();
        }

        holder.setTitle(mApps.get(position).getTitle(),mApps.get(position).getVersionName());

        notifyDataSetChanged();

        holder.offTxt.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                holder.spiner.performClick();

            }
        });

        holder.spiner.setAdapter(dataAdapter);
        holder.spiner.setOnItemSelectedListener(new OnItemSelectedListener() {
            public void onItemSelected(AdapterView<?> arg0, View arg1,int arg2, long arg3) {
                spinerposition=arg2;
                switch (spinerposition)
                {
                case 1:

                    holder.offtext.setText("None");
                    break;
                case 2:

                    holder.offtext.setText("Entertainment");
                    break;
                case 3:

                    holder.offtext.setText("Games");
                    break;
                case 4:

                    holder.offtext.setText("News/Books");
                    break;
                case 5:

                    holder.offtext.setText("Social Networking");
                    break;
                case 6:

                    holder.offtext.setText("Utilities");
                    break;
                case 7:

                    holder.offtext.setText("Texting");
                    break;
                case 8:

                    holder.offtext.setText("Web Browsers");
                    break;
                }
            }
            public void onNothingSelected(AdapterView<?> arg0) {
            }
        });
        return convertView; 
    }



    /**
     * Sets the list of apps to be displayed.
     * 
     * @param list the list of apps to be displayed
     */
    public void setListItems(List<App> list) { 
        mApps = list; 
    }

    /**
     * A view holder which is used to re/use views inside a list.
     */
    public class AppViewHolder {

        private TextView mTitle = null;
        private TextView apptitleTxt = null;
        private TextView offTxt = null;
        private Spinner spiner=null;
        public TextView offtext;
        /**
         * Sets the text to be shown as the app's title
         * 
         * @param title the text to be shown inside the list row
         */
        public void setTitle(String title,String category) {
            apptitleTxt.setText(title);
//          offtext.setText(category);
        }
    }

}

推荐答案

我找到了解决该问题的方法.我介绍了一个正在使用ArrayList的dialogList().下面我提到了我的Adapter类的代码.

I got the solution for the issue. I have introduced a dialogList() in which I am working with a ArrayList. Below I have mentioned the code of my Adapter class.

public class AppListAdapter extends BaseAdapter {

    private LayoutInflater mInflater;
    private List<App> mApps = Constants.list;
    private Context _activity;
    ArrayList<String> months=null;
    ArrayAdapter<String> dataAdapter =null;
    int spinerposition;
    Context contextfordatabase=null;

    int temp=0;
    private int screenWidth;


    /**
     * Constructor.
     * 
     * @param context the application context which is needed for the layout inflater
     * @param screenWidth 
     */
    public AppListAdapter(Context context, int screenWidth) {
        contextfordatabase=context;
        // Cache the LayoutInflate to avoid asking for a new one each time.
        mInflater = LayoutInflater.from(context);
        this._activity=context;
        this.screenWidth = screenWidth;

        months = new ArrayList<String>();
        months.add("No Item Selected");
        months.add("None");
        months.add("Entertainment");
        months.add("Games");
        months.add("News/Books");
        months.add("Social Networking");
        months.add("Utilities");
        months.add("Texting");
        months.add("Web Browsers");
    }

    public int getCount() {

        return mApps.size();
    }

    public Object getItem(int position) {
        return mApps.get(position);
    }

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

    public class AppViewHolder {

        private TextView mTitle = null;
        private TextView apptitleTxt = null;
        private TextView offTxt = null;
        private Spinner spiner=null;
        public TextView offtext;
    }

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

        final AppViewHolder holder;
        if(convertView == null) {
            convertView = mInflater.inflate(R.layout.row, null);
            // creates a ViewHolder and stores a reference to the children view we want to bind data to
            holder = new AppViewHolder();

            holder.spiner=(Spinner)convertView.findViewById(R.id.spinner);
            holder.offtext=(TextView)convertView.findViewById(R.id.off_txt);

            holder.apptitleTxt = (TextView) convertView.findViewById(R.id.apptitle_txt);
            Typeface typeface = Typeface.createFromAsset(_activity.getAssets(),"CHICM___.TTF");
            holder.apptitleTxt.setTypeface(typeface);
            holder.offtext.setTypeface(typeface);

            if(screenWidth>480){
                holder.offtext.setTextSize(30);
                holder.apptitleTxt.setTextSize(30);
            }
            convertView.setTag(holder);
        } else { 
            holder = (AppViewHolder) convertView.getTag();
        }

        holder.offtext.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                dialogList(holder.offtext, position);
            }
        });

        holder.apptitleTxt.setText(mApps.get(position).getTitle());
        holder.offtext.setText(mApps.get(position).getVersionName());

        return convertView; 
    }

    /**
     * Sets the list of apps to be displayed.
     * 
     * @param list the list of apps to be displayed
     */
    public void setListItems(List<App> list) { 
        mApps = list; 
    }

    public void dialogList(final TextView textView, final int clickedPosition){
        Builder builder = new AlertDialog.Builder(_activity);
        builder.setTitle("Select Category");
        builder.setItems(R.array.category_list, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) 
            {
                textView.setText(months.get(which+1));
                App app = new App();
                app.setTitle(mApps.get(clickedPosition).getTitle());
                app.setPackageName(mApps.get(clickedPosition).getPackageName());
                app.setVersionName(months.get(which+1));
                app.setVersionCode(mApps.get(clickedPosition).getVersionCode());
                mApps.set(clickedPosition, app);
                System.out.println(clickedPosition+" : "+months.get(which+1));


                update_database(mApps.get(clickedPosition).getPackageName(),months.get(which+1));


                AppListAdapter.this.notifyDataSetChanged();
            }

        });
        builder.create();
        builder.show();
    }

    public void update_database(String packageName, String string) {
        CallBackDatabase callback = new CallBackDatabase(contextfordatabase);
        callback.open();
        Cursor cursor =callback.getAll(packageName);
        int y=cursor.getCount();
        int j=0;
        if(y!=0)
        {
            callback.UpdateCategory(packageName, string);
        }
        else
        {
            callback.InsertAppInfo(null, packageName, "0", "0", "0", "null", string);
        }
        cursor.deactivate();
        cursor.close();
        callback.close();
    }

}

这篇关于ListView行中的TextView在Android中显示滚动时重复的值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆