-1

I create listview which provide unique view in every row but I added checkbox. I had a problem in that will check first item and scroll the List. Weirdly anonymous items where get checked. Can you provide solution for that? Thanks

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    int type = getItemViewType(position);
    final ItemDto dto = listStoreItemDto.get(position);
    if (convertView == null) {
        holder = new ViewHolder();
        switch (type) {
            case TYPE_IMAGE:
                convertView = mInflater.inflate(R.layout.listview_video, null);
                holder.vidImgAdapter = (ImageView)convertView.findViewById(R.id.vidImgAdapter);
                holder.vidImgPlayAdapter = (ImageView)convertView.findViewById(R.id.vidImgPlayAdapter);
                holder.vidNameAdapter = (TextViewVerbStyle)convertView.findViewById(R.id.vidNameAdapter);
                holder.vidDetailAdapter = (TextViewVerbStyle)convertView.findViewById(R.id.vidDetailAdapter);
                holder.linearAdpVideo = (LinearLayout)convertView.findViewById(R.id.linearAdpVideo);
                holder.tbAdpVideo = (ToggleButton)convertView.findViewById(R.id.tbAdpVideo);
                break;
            case TYPE_VIDEO:
                convertView = mInflater.inflate(R.layout.listview_video, null);
                holder.vidImgAdapter = (ImageView)convertView.findViewById(R.id.vidImgAdapter);
                holder.vidImgPlayAdapter = (ImageView)convertView.findViewById(R.id.vidImgPlayAdapter);
                holder.vidNameAdapter = (TextViewVerbStyle)convertView.findViewById(R.id.vidNameAdapter);
                holder.vidDetailAdapter = (TextViewVerbStyle)convertView.findViewById(R.id.vidDetailAdapter);
                holder.linearAdpVideo = (LinearLayout)convertView.findViewById(R.id.linearAdpVideo);
                holder.tbAdpVideo = (ToggleButton)convertView.findViewById(R.id.tbAdpVideo);
                break;
            case TYPE_MUSIC:
                convertView = mInflater.inflate(R.layout.listview_music, null);
                holder.musicImgAdapter = (ImageView)convertView.findViewById(R.id.musicImgAdapter);
                holder.musicNameAdapter = (TextViewVerbStyle)convertView.findViewById(R.id.musicNameAdapter);
                holder.musicDetailAdapter = (TextViewVerbStyle)convertView.findViewById(R.id.musicDetailAdapter);
                holder.tbAdpMusic = (ToggleButton)convertView.findViewById(R.id.tbAdpMusic);
                holder.linearAdpMusic = (LinearLayout)convertView.findViewById(R.id.linearAdpMusic);
                break;
            case TYPE_STORAGE:
                convertView = mInflater.inflate(R.layout.listview_storage, null);
                holder.storageImgAdapter = (ImageView)convertView.findViewById(R.id.storageImgAdapter);
                holder.imgAdpStorageChevronRight = (ImageView)convertView.findViewById(R.id.imgAdpStorageChevronRight);
                holder.storageNameAdapter = (TextViewVerbStyle)convertView.findViewById(R.id.storageNameAdapter);
                holder.storageDetailAdapter = (TextViewVerbStyle)convertView.findViewById(R.id.storageDetailAdapter);
                holder.linearAdpStorage = (LinearLayout)convertView.findViewById(R.id.linearAdpStorage);
                holder.tbAdpStorage = (ToggleButton)convertView.findViewById(R.id.tbAdpStorage);
                break;
        }
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder)convertView.getTag();
    }
    Log.e("will","holder : "+holder.tbAdpStorage +" | "+holder.tbAdpVideo + " | "+holder.tbAdpMusic);
    switch (type){
        case TYPE_IMAGE:
            MainActivityV3.getImgLoader().init(config);
            MainActivityV3.getImgLoader().displayImage("file://" + Uri.parse(dto.getItemPath()), holder.vidImgAdapter, MainActivityV3.getOptions());
            holder.vidImgPlayAdapter.setVisibility(View.GONE);
            holder.vidNameAdapter.setText(dto.getItemName());
            holder.vidDetailAdapter.setText(mContext.getResources().getString(R.string.detail_item,
                    StringUtils.showSizeByte(FileManageUtil.getKbSize(dto.getItemSize()),
                            FileManageUtil.getMbSize(dto.getItemSize())), StringUtils.getDateVideo(dto.getLastModified())));
            if(isCheckable) {
                holder.linearAdpVideo.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (dto.isSelected()) {
                            dto.setIsSelected(false);
                            holder.tbAdpVideo.setChecked(dto.isSelected());
                        } else {
                            dto.setIsSelected(true);
                            holder.tbAdpVideo.setChecked(dto.isSelected());
                        }
                        ((MainActivityV3) mContext).updateSelected(getTotalItemSelected());
                    }
                });
                holder.tbAdpVideo.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (dto.isSelected()) {
                            dto.setIsSelected(false);
                        } else {
                            dto.setIsSelected(true);
                        }
                        ((MainActivityV3) mContext).updateSelected(getTotalItemSelected());
                    }
                });
                holder.tbAdpVideo.setVisibility(View.VISIBLE);
            }
            else {
                holder.tbAdpVideo.setVisibility(View.GONE);
            }
            break;
        case TYPE_VIDEO:
            MainActivityV3.getImgLoader().init(config);
            MainActivityV3.getImgLoader().displayImage("file://" + Uri.parse(dto.getItemPath()), holder.vidImgAdapter, MainActivityV3.getOptions());
            holder.vidNameAdapter.setText(dto.getItemName());
            holder.vidDetailAdapter.setText(mContext.getResources().getString(R.string.detail_item,
                    StringUtils.showSizeByte(FileManageUtil.getKbSize(dto.getItemSize()),
                            FileManageUtil.getMbSize(dto.getItemSize())), StringUtils.getDateVideo(dto.getLastModified())));
            if(isCheckable){
                holder.linearAdpVideo.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (dto.isSelected()) {
                            dto.setIsSelected(false);
                            holder.tbAdpVideo.setChecked(dto.isSelected());
                        } else {
                            dto.setIsSelected(true);
                            holder.tbAdpVideo.setChecked(dto.isSelected());
                        }
                        ((MainActivityV3) mContext).updateSelected(getTotalItemSelected());
                    }
                });
                holder.tbAdpVideo.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (dto.isSelected()) {
                            dto.setIsSelected(false);
                        } else {
                            dto.setIsSelected(true);
                        }
                        ((MainActivityV3) mContext).updateSelected(getTotalItemSelected());
                    }
                });
                holder.tbAdpVideo.setVisibility(View.VISIBLE);
            }
            else {
                holder.tbAdpVideo.setVisibility(View.GONE);
            }
            break;
        case TYPE_MUSIC:
            if(dto.getItemName().toString().toLowerCase().contains(".mp3"))
                holder.musicImgAdapter.setImageResource(R.drawable.ic_mp3);
            else if(dto.getItemName().toString().toLowerCase().contains(".ogg"))
                holder.musicImgAdapter.setImageResource(R.drawable.ic_ogg);
            else if(dto.getItemName().toString().toLowerCase().contains(".mp4"))
                holder.musicImgAdapter.setImageResource(R.drawable.ic_mp4);
            else if(dto.getItemName().toString().toLowerCase().contains(".wav"))
                holder.musicImgAdapter.setImageResource(R.drawable.ic_wav);
            holder.musicNameAdapter.setText(dto.getItemName());
            holder.musicDetailAdapter.setText(mContext.getResources().getString(R.string.detail_item, StringUtils.showSizeByte(FileManageUtil.getKbSize(dto.getItemSize()),
                    FileManageUtil.getMbSize(dto.getItemSize())), StringUtils.getDateVideo(dto.getLastModified())));
            if(isCheckable) {
                holder.linearAdpMusic.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (dto.isSelected()) {
                            dto.setIsSelected(false);
                            holder.tbAdpMusic.setChecked(dto.isSelected());
                        } else {
                            dto.setIsSelected(true);
                            holder.tbAdpMusic.setChecked(dto.isSelected());
                        }
                        ((MainActivityV3) mContext).updateSelected(getTotalItemSelected());
                    }
                });
                holder.tbAdpMusic.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (dto.isSelected()) {
                            dto.setIsSelected(false);
                        } else {
                            dto.setIsSelected(true);
                        }
                        ((MainActivityV3) mContext).updateSelected(getTotalItemSelected());
                    }
                });
                holder.tbAdpMusic.setVisibility(View.VISIBLE);
            }
            else {
                holder.tbAdpMusic.setVisibility(View.GONE);
            }
            break;
        case TYPE_STORAGE:
            File file = new File(dto.getItemPath());
            if(dto.isDirectory()){
                holder.storageDetailAdapter.setText(mContext.getResources().getString(R.string.detail_item,
                        file.listFiles().length>=1?file.listFiles().length+" items":file.listFiles().length+" item",
                        StringUtils.getDateVideo(dto.getLastModified())));
                holder.storageImgAdapter.setImageResource(R.drawable.ic_folder);
                holder.imgAdpStorageChevronRight.setVisibility(View.VISIBLE);
            }else{
                if(StringUtils.isArchivesExtension(mContext,dto.getItemName())){//file archive
                    holder.storageImgAdapter.setImageResource(R.drawable.ic_archives);
                }else if(StringUtils.isDocsExtension(mContext,dto.getItemName())){//file doc
                    holder.storageImgAdapter.setImageResource(R.drawable.ic_text_doc);
                }else if(StringUtils.isApkExtension(mContext,dto.getItemName())){
                    holder.storageImgAdapter.setImageResource(R.drawable.ic_apk);
                }
                else{//broken image
                    holder.storageImgAdapter.setImageResource(R.drawable.ic_broken_image);
                }
                holder.storageDetailAdapter.setText(mContext.getResources().getString(R.string.detail_item,
                        StringUtils.showSizeByte(dto.getItemSize()),
                        StringUtils.getDateVideo(dto.getLastModified())));
                holder.imgAdpStorageChevronRight.setVisibility(View.GONE);
            }
            holder.storageNameAdapter.setText(dto.getItemName());
            if(isCheckable) {
                holder.linearAdpStorage.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (dto.isSelected()) {
                            dto.setIsSelected(false);
                            holder.tbAdpStorage.setChecked(dto.isSelected());
                        } else {
                            dto.setIsSelected(true);
                            holder.tbAdpStorage.setChecked(dto.isSelected());
                        }
                        ((MainActivityV3) mContext).updateSelected(getTotalItemSelected());
                    }
                });
                holder.tbAdpStorage.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (dto.isSelected()) {
                            dto.setIsSelected(false);
                        } else {
                            dto.setIsSelected(true);
                        }
                        ((MainActivityV3) mContext).updateSelected(getTotalItemSelected());
                    }
                });
                if(dto.isDirectory())
                    holder.imgAdpStorageChevronRight.setVisibility(View.GONE);
                holder.tbAdpStorage.setVisibility(View.VISIBLE);
            }
            else {
                holder.tbAdpStorage.setVisibility(View.GONE);
            }
            break;
    }
    return convertView;
}
Ginx
  • 1
  • 6
  • The reason behind this is, listview recycles the view once its out of the screen. – Kshitij Jain Oct 07 '16 at 10:11
  • use Recycle view instead. There are implementation of VIewHolder adapter and binding pattern You views always will be as you expect – once2go Oct 07 '16 at 10:14
  • can you post your getview() code? – Exigente05 Oct 07 '16 at 10:16
  • thx all for ur response.. here is my getview @Exigente05 – Ginx Oct 07 '16 at 10:21
  • An hour ago the same question was asked. Dont you read stackoverflow? Dont you google a bit? http://stackoverflow.com/questions/39912827/random-checkbox-getting-checked-when-scrolling-down-the-list-view – greenapps Oct 07 '16 at 10:27
  • what if you add holder.tbAdpVideo.setChecked(dto.isSelected()); before if(isCheckable)? – Exigente05 Oct 07 '16 at 10:29
  • `listview which provide unique view in every row`. To me it looks that you have exactly four types of views. – greenapps Oct 07 '16 at 10:39
  • @greenapps its not problem to me when i make listview with no unique every row but i get problem when make this listview have 4 different row – Ginx Oct 07 '16 at 10:45
  • `if (dto.isSelected())`. You use a final dto. But that does not belong to the item the user clicks but to the item which is handled by the last getView(). You should more have someting like `if (listStoreItemDto.get(position).isSelected())`. So you should know `position` of the clicked item. Well think about it. You could put posiion in the tag of the checkbox. – greenapps Oct 07 '16 at 10:46
  • @greenapps i already change to listStoreItemDto.get(position) but it make my position convert to final int position and it still didnt work.... btw thx for ur suggestion – Ginx Oct 07 '16 at 10:56
  • You cannot use a final int position as it will also here always be the position of the last item handled by getView() and not that of the item the user clicked. But why did you try this? I already told you what you had to do instead. – greenapps Oct 07 '16 at 11:02
  • You are not making use of OnListItemClicked(). That would give you the position of ... the item clicked. – greenapps Oct 07 '16 at 11:04

3 Answers3

1

You must create a class with all component (EX: ComponentClass) that you want to show in row of listview. in this class create boolean value and all setter/getter and ... . In adapter Java class extent arrayAdapter, you must create inner class named ViewHolder and use this inner class to show componnet of adapter.

static class ViewHolder {
    TextView text;
    CheckBox checkbox;
}

and in getView method, use blew code:

viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                int getPosition = (Integer) buttonView.getTag();  // Here we get the position that we have set for the checkbox using setTag.
                ComponentClass.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state.
            }
        });

Thanks to Lalit Poptani

Community
  • 1
  • 1
Saeed Fekri
  • 1,067
  • 9
  • 12
0

I had the same problem. I solved it by overriding this two method in adapter class.

@Override
public int getViewTypeCount() {
          return getCount();
}

@Override
public int getItemViewType(int position) {

 return position;
}

Hope this helps!

iamabhaykmr
  • 1,803
  • 3
  • 24
  • 49
  • No it will not help. You posted this code also an hour ago as Answer for another post. But it was not accepted as correct. Your code cannot be used to solve the recycling problem at all. – greenapps Oct 07 '16 at 10:29
  • Hey, that was not complete one. I have updated that code now. It will work now. Do try it once . – iamabhaykmr Oct 07 '16 at 10:32
0

Great example shown here

Example 2

You are selecting one and View holder keeps it selected. You can add a bolean variable into your ObjectIncome object and keep your item's selection status.

public class AdapterTrashIncome extends RecyclerView.Adapter<AdapterTrashIncome.ViewHolder> {

    private ArrayList<ObjectIncome> myItems = new ArrayList<>();

    public AdapterTrashIncome(ArrayList<ObjectIncome> getItems, Context context){
        try {
            mContext = context;
            myItems = getItems;
            }catch (Exception e){
            Log.e(FILE_NAME, "51: " + e.toString());
            e.printStackTrace();
        }
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        public TextView tvContent;
        public CheckBox cbSelect;

        public ViewHolder(View v) {
            super(v);
            tvContent = (TextView) v.findViewById(R.id.tvContent);
            cbSelect = (CheckBox) v.findViewById(R.id.cbSelect);
        }
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        final ObjectIncome objIncome = myItems.get(position);
        String content = "<b>lalalla</b>";
        holder.tvContent.setText(Html.fromHtml(content));

        //in some cases, it will prevent unwanted situations
        holder.cbSelect.setOnCheckedChangeListener(null);

        //if true, your checkbox will be selected, else unselected
        holder.cbSelect.setChecked(objIncome.isSelected());

        holder.cbSelect.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    //set your object's last status
                    objIncome.setSelected(isChecked);
            }
        });

    }
}

inside your Activity's onCreate method.

recyclerView = (RecyclerView) findViewById(R.id.recyclerview1);

        recylerViewLayoutManager = new LinearLayoutManager(context);

        recyclerView.setLayoutManager(recylerViewLayoutManager);

        recyclerViewAdapter = new RecyclerViewAdapter(context, subjects);

        recyclerView.setAdapter(recyclerViewAdapter);

Your Activiy xml be like

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.android_examples.recyclerview_android_examplescom.MainActivity"
    android:id="@+id/relativelayout1">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerview1"
        android:scrollbars="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        />

</RelativeLayout>
sivaBE35
  • 1,876
  • 18
  • 23