繁体   English   中英

Listview 中的复选框使用错误的位置项进行检查

[英]Checkbox in Listview get check with wrong position item

我创建了在每一行中提供独特视图的列表视图,但我添加了复选框。 我在检查第一项并滚动列表时遇到了问题。 奇怪的匿名项目在哪里得到检查。 你能提供解决方案吗? 谢谢

@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;
}

您必须创建一个包含要在列表视图行中显示的所有组件(例如:ComponentClass)的类。 在这个类中创建布尔值和所有的 setter/getter 和 ... 。 在适配器Java 类extent arrayAdapter 中,必须创建名为ViewHolder 的内部类,并使用该内部类来显示适配器的组件。

static class ViewHolder {
    TextView text;
    CheckBox checkbox;
}

在 getView 方法中,使用 blew 代码:

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.
            }
        });

感谢Lalit Poptani

我有同样的问题。 我通过在适配器类中覆盖这两个方法来解决它。

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

@Override
public int getItemViewType(int position) {

 return position;
}

希望这可以帮助!

这里显示了很好的例子

示例 2

您正在选择一个,而 View holder 将其保持选中状态。 您可以将 bolean 变量添加到 ObjectIncome 对象中并保持项目的选择状态。

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);
            }
        });

    }
}

在您的 Activity 的 onCreate 方法中。

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

        recylerViewLayoutManager = new LinearLayoutManager(context);

        recyclerView.setLayoutManager(recylerViewLayoutManager);

        recyclerViewAdapter = new RecyclerViewAdapter(context, subjects);

        recyclerView.setAdapter(recyclerViewAdapter);

你的Activiy xml就像

<?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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM