Listview在选择模式下无法在滚动条上保持可绘制状态;选择“U模式”和“多个”;

Listview在选择模式下无法在滚动条上保持可绘制状态;选择“U模式”和“多个”;,listview,multipleselection,Listview,Multipleselection,我试图通过在OnItemClickListener中设置drawable来多选列表视图,但当我滚动列表视图时,所选项目将丢失我在listview.OnItemClickListener的ItemChecked方法中更改的drawable 我所做的一切: 1.在drawable中使用xml选择器 2.尝试在自定义适配器中更改selecteditems的可绘制性 上述任何一种方法都不能解决stackoverflow问题 这是我的适配器: public class QuestionsOptionsAd

我试图通过在OnItemClickListener中设置drawable来多选列表视图,但当我滚动列表视图时,所选项目将丢失我在listview.OnItemClickListener的ItemChecked方法中更改的drawable

我所做的一切:

1.在drawable中使用xml选择器

2.尝试在自定义适配器中更改selecteditems的可绘制性

上述任何一种方法都不能解决stackoverflow问题

这是我的适配器:

public class QuestionsOptionsAdapterMultipleSelectionLV extends BaseAdapter {
    Context context;
    ArrayList<QuestionOptionsModel> items;
    String which;
    CollegepondSandbox cs;
    ArrayList<String> arr;
    boolean isTouch = false;
    int positionselected;
    QuestionsOptionsAdapterMultipleSelectionLV adapter1;



 public QuestionsOptionsAdapterMultipleSelectionLV(Context context, 
        ArrayList<QuestionOptionsModel> items) {
        this.context = context;
        this.items = items;
        this.which = which;
        this.arr = arr;
        cs = new CollegepondSandbox();


    }


    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return items.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return items.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
       // positionselected =items.indexOf(items.get(position));
        return items.indexOf(items.get(position));
    }

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

    @Override
    public int getItemViewType(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup 
    parent) {
            if(convertView==null){
        LayoutInflater inflater = (LayoutInflater) 
    context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

        convertView = inflater.inflate(R.layout.custom_options_multiple, 
     null);

        WebView tvOptiontext;
        ImageView ivOption;

        LinearLayout llOptionsMultiple;

        ivOption = (ImageView) convertView.findViewById(R.id.cbOption);
        tvOptiontext = (WebView) convertView.findViewById(R.id.tvOptiontext);
        llOptionsMultiple = (LinearLayout) convertView.findViewById(R.id.llOptionsMultiple);
        tvOptiontext.loadData(items.get(position).QOption, "text/html", "utf-8");

        return convertView;
        }
       }
public class QuestionsOptionsAdapterMultipleSelectionLV扩展BaseAdapter{
语境;
数组列表项;
其中字符串;
集装箱式cs;
ArrayList-arr;
布尔isTouch=false;
选择int位置;
问题选项ADAPTERM多选LV适配器1;
公共问题情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景情景,
ArrayList项目){
this.context=上下文;
这个项目=项目;
this.which=哪个;
this.arr=arr;
cs=新的CollegepondSandbox();
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回items.size();
}
@凌驾
公共对象getItem(int位置){
//TODO自动生成的方法存根
返回项目。获取(位置);
}
@凌驾
公共长getItemId(int位置){
//TODO自动生成的方法存根
//positionselected=items.indexOf(items.get(position));
返回items.indexOf(items.get(position));
}
@凌驾
public int getViewTypeCount(){
返回getCount();
}
@凌驾
public int getItemViewType(int位置){
返回位置;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组
(家长){
if(convertView==null){
LayoutInflater充气机=(LayoutInflater)
context.getSystemService(Activity.LAYOUT\u INFLATER\u SERVICE);
convertView=充气机。充气(R.layout.custom\u选项\u多个,
无效);
网络视图tvOptiontext;
图像视图选项;
线性布局选项多个;
ivOption=(ImageView)convertView.findViewById(R.id.cbOption);
TVOTIONTEXT=(WebView)convertView.findViewById(R.id.TVOTIONTEXT);
llOptionsMultiple=(LinearLayout)convertView.findViewById(R.id.llOptionsMultiple);
加载数据(items.get(position.QOption,“text/html”、“utf-8”);
返回视图;
}
}
以下是我的听众:

  lvOption.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
            lvOption.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(final AdapterView<?> parent, View view, int position, long id) {

                    ivOption = (ImageView) view.findViewById(R.id.cbOption);

                       if (lvOption.isItemChecked(position)) {
                            ivOption.setImageResource(R.drawable.tick_2);
       multipleSelectedIDs.add(answersal.get(position).QIsCorrect);
                        } else {
                            ivOption.setImageResource(R.drawable.tick_1);
      multipleSelectedIDs.remove(answersal.get(position).QIsCorrect);
                        }
                });
lvOption.setChoiceMode(ListView.CHOICE\u MODE\u MULTIPLE);
lvOption.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(最终适配器视图父级、视图视图、整型位置、长id){
ivOption=(ImageView)view.findViewById(R.id.cbOption);
如果(lvOption.isItemChecked(位置)){
ivOption.setImageResource(R.drawable.tick_2);
多个selecteds.add(answersal.get(position).QIsCorrect);
}否则{
ivOption.setImageResource(R.drawable.tick_1);
多个selecteds.remove(answersal.get(position).QIsCorrect);
}
});

在stackoverflow上发现了类似的问题,并根据我的需要进行了修改

步骤:

1.将位置作为字符串存储在Arraylist中

2.将arraylist传递给适配器

3.如下面代码所示,更改可在适配器中绘制而不在活动中绘制:

listview.OnItemClick in活动中的更改:

  if (lvOption.isItemChecked(position)) {
                        multipleSelectedIDs.add(answersal.get(position).QIsCorrect);
                        selected.add(String.valueOf(position));
                    } else {
                        multipleSelectedIDs.remove(answersal.get(position).QIsCorrect);
                        selected.remove(String.valueOf(position));
                    }
                    adapterMultipleListview.setSelectedDrawable(selected);
现在更改适配器:

//add this method in adapter
 public void setSelectedDrawable(ArrayList<String> ind) {
    selectedIndex = ind;
    notifyDataSetChanged();
}
//change drawable in getview() method
 if (selectedIndex.contains(String.valueOf(position))) {
        ivOption.setBackgroundResource(R.drawable.tick_2);
    } else {
        ivOption.setBackgroundResource(R.drawable.tick_1);
    }
//在适配器中添加此方法
公共无效设置选择可绘制(ArrayList ind){
selectedIndex=ind;
notifyDataSetChanged();
}
//在getview()方法中更改drawable
if(selectedIndex.contains(String.valueOf(position))){
ivOption.setBackgroundResource(R.drawable.tick_2);
}否则{
ivOption.setBackgroundResource(R.drawable.tick_1);
}

在stackoverflow上发现了类似的问题,并根据我的需要进行了修改

步骤:

1.将位置作为字符串存储在Arraylist中

2.将arraylist传递给适配器

3.如下面代码所示,更改可在适配器中绘制而不在活动中绘制:

listview.OnItemClick in活动中的更改:

  if (lvOption.isItemChecked(position)) {
                        multipleSelectedIDs.add(answersal.get(position).QIsCorrect);
                        selected.add(String.valueOf(position));
                    } else {
                        multipleSelectedIDs.remove(answersal.get(position).QIsCorrect);
                        selected.remove(String.valueOf(position));
                    }
                    adapterMultipleListview.setSelectedDrawable(selected);
现在更改适配器:

//add this method in adapter
 public void setSelectedDrawable(ArrayList<String> ind) {
    selectedIndex = ind;
    notifyDataSetChanged();
}
//change drawable in getview() method
 if (selectedIndex.contains(String.valueOf(position))) {
        ivOption.setBackgroundResource(R.drawable.tick_2);
    } else {
        ivOption.setBackgroundResource(R.drawable.tick_1);
    }
//在适配器中添加此方法
公共无效设置选择可绘制(ArrayList ind){
selectedIndex=ind;
notifyDataSetChanged();
}
//在getview()方法中更改drawable
if(selectedIndex.contains(String.valueOf(position))){
ivOption.setBackgroundResource(R.drawable.tick_2);
}否则{
ivOption.setBackgroundResource(R.drawable.tick_1);
}