CustomListAdapter列表项彼此模仿

时间:2016-09-27 07:39:23

标签: android listview custom-lists

我已经阅读并尝试了几种解决堆栈溢出的类似问题的解决方案,但它们都没有解决我的问题。事情就是这样。

我有listview使用CustomListAdapter,每个列表项都有progress bar,下载按钮,标题文本等等。单击下载button时,将执行下载操作,并根据下载结果(成功或失败)更新相关列表项(UI更改,例如完成隐藏下载按钮,在下载过程中更新progress bar的进度)

listview在每个给定时间显示四个项目

first four items on display

问题在于,只要对项目进行UI更改,例如项目1(索引为0),项目5也将具有相同的更改,同样如果对项目3进行了更改,则项目7接受这些变化。总之,项目N + 4总是模仿项目N。

changes of item zero, duplicated by item 5

查看我的getView()会告诉我已经检查了所有已知的方框。

 @Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = convertView;
    ViewHolder holder;

    if (convertView == null) {
        view = inflater.inflate(R.layout.item_mylibrarylist, null);
        holder = new ViewHolder();

        holder.name = (TextView)view.findViewById(R.id.name);
        holder.name.setTypeface(MainActivity.font_bahamas);

        holder.author = (TextView)view.findViewById(R.id.author);
        holder.author.setTypeface(MainActivity.font_bahamas);

        holder.worktype = (TextView)view.findViewById(R.id.worktype);
        holder.worktype.setTypeface(MainActivity.font_bahamas);

        holder.coverPic = (TextView)view.findViewById(R.id.coverPic);
        holder.downloadBt = (TextView)view.findViewById(R.id.downloadBt);
        holder.progressBar = (ProgressBar)view.findViewById(R.id.progressBar2);

        holder.menuBt = (ImageView)view.findViewById(R.id.menuBt);

        holder.position =  position;

        view.setTag(holder);

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

    }

    if(holder.position == position)   {
        setValuesForListItemViews(holder, position, view);
    }
    return view;
}

设置每个列表项的方法..

private void setValuesForListItemViews(ViewHolder holder, int position, View view) {

    if (!data.isEmpty()) {
        // set the list item elements here
        final CreativeWork creativeWork = data.get(position);

        holder.name.setText(creativeWork.getName().toLowerCase());
        holder.author.setText("by " + creativeWork.getOriginal_authors().toLowerCase());
        holder.worktype.setText(creativeWork.getWork_type().toLowerCase());

        Drawable draw = res.getDrawable(R.drawable.custom_progressbar2);
        holder.progressBar.setProgressDrawable(draw);
        holder.progressBar.setMax(100);
        holder.progressBar.setVisibility(View.INVISIBLE);

        holder.menuBt.setOnClickListener(new OnItemClickedListener(view, position, 1, creativeWork, holder.progressBar, holder.downloadBt));
        holder.menuBt.setOnCreateContextMenuListener(new MContextMenuListener(creativeWork, holder.progressBar, holder.downloadBt, false));


        //load image url
        ImageLoader2 imgLoader12 = new ImageLoader2(activity);
        imgLoader12.DisplayImage(creativeWork.getName(), R.drawable.downloads, holder.downloadBt);

        ImageLoader imgLoader = new ImageLoader(activity);
        imgLoader.DisplayImage(SLService.END_POINT + creativeWork.getImage_url(), R.drawable.soul_lounge, holder.coverPic);

        //check if file already exist and switch off download button
        DBHelper helper = new DBHelper(activity);
        CreativeWork cw = helper.getCreativeWork(creativeWork);

        if (cw != null) {
            File file = new File(cw.getFilePath());
            if (file.exists()) {
                holder.menuBt.setOnCreateContextMenuListener(new MContextMenuListener(creativeWork, holder.progressBar, holder.downloadBt, true));

                //check if the file download was complete
                if (cw != null) {
                    if (cw.getFileSize() > file.length()) {
                        holder.progressBar.setProgressDrawable(activity.getResources().getDrawable(R.drawable.custom_progressbar3));

                        ImageLoader2 imgLoader2 = new ImageLoader2(activity);
                        imgLoader2.DisplayImage(cw.getName(), R.drawable.restart, holder.downloadBt);

                        holder.progressBar.setProgress((int) ((file.length() * 100) / cw.getFileSize()));
                        holder.progressBar.setVisibility(View.VISIBLE);
                    } else {
                        holder.downloadBt.setVisibility(View.INVISIBLE);
                    }
                }
            }
        }
        holder.downloadBt.setOnClickListener(new OnItemClickedListener(view, position, creativeWork, holder.progressBar, holder.downloadBt, 0));
    }
}

2 个答案:

答案 0 :(得分:1)

解决此问题的最简单方法是在模型类中添加一些额外的字段,这些字段将传递给适配器。

喜欢

boolean showDownloadButton; //default is true
int progress;// default is 0

因此,当用户点击下载按钮(或任何其他所需事件)时,将boolean的{​​{1}}值更改为给定位置的模型对象的false,并调用showDownloadButton并管理适配器中相应的按钮可见性。

并确保为视图添加可见和已消除条件

adapter.notifyDatasetChanged()

答案 1 :(得分:0)

Nitesh的回答是正确的,如果你不想创建Model类,还有另一种方法可以做。

使用带位置的setId和getId来标识唯一行并将该id分配给解决方案的进度条