首先来说一下具体的需求是什么样的:

需求如图所示,这里面有ABCD四个选项的题目,当点击A选项,如果A是正确的答案,则变成对勾的图案,如果是错误答案,则变成错误的图案,

这里当时在写的时候觉得很简单,只要是在点击的时候判断我点击的选项与正确答案是否一样,是一样就将图片换成正确的样式,如果不一样就换成错误的样式,于是我便写了下面的代码(只贴出了核心Adapter中的代码)

package com.fizzer.anbangproject_dahuo_test.Adapter;import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;import com.fizzer.anbangproject_dahuo_test.Model.ConvertModel;
import com.fizzer.anbangproject_dahuo_test.R;import java.util.List;/*** Created by Fizzer on 2016/10/8.* Email: doraemonmqq@sina.com*/
public class ConvertViewAdapter extends BaseAdapter {private List<ConvertModel> list;private Context mContext;public ConvertViewAdapter(Context context, List<ConvertModel> list) {mContext = context;this.list = list;}@Overridepublic int getCount() {if (list == null) {return 0;} else {return list.size();}}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder mViewHolder;if (convertView == null) {convertView = View.inflate(mContext, R.layout.view_upgradepartnet_topic_layout, null);mViewHolder = new ViewHolder();mViewHolder.tvTitle = (TextView) convertView.findViewById(R.id.tvTitle);mViewHolder.tvSelectA = (TextView) convertView.findViewById(R.id.tvSelectA);mViewHolder.tvSelectB = (TextView) convertView.findViewById(R.id.tvSelectB);mViewHolder.tvSelectC = (TextView) convertView.findViewById(R.id.tvSelectC);mViewHolder.tvSelectD = (TextView) convertView.findViewById(R.id.tvSelectD);convertView.setTag(mViewHolder);} else {mViewHolder = (ViewHolder) convertView.getTag();}ConvertModel module = list.get(position);mViewHolder.tvTitle.setText("Q" + (position + 1) + ":" + module.title);mViewHolder.tvSelectA.setText(module.optionA);mViewHolder.tvSelectB.setText(module.optionB);mViewHolder.tvSelectC.setText(module.optionC);mViewHolder.tvSelectD.setText(module.optionD);initListener(mViewHolder, module.rightOption, position, module);return convertView;}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}private void initListener(final ViewHolder mViewHolder, final String select, final int position, final ConvertModel module) {mViewHolder.tvSelectA.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {judgeSelect(mViewHolder, mViewHolder.tvSelectA, "A", select, position);}});mViewHolder.tvSelectB.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {judgeSelect(mViewHolder, mViewHolder.tvSelectB, "B", select, position);}});mViewHolder.tvSelectC.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {judgeSelect(mViewHolder, mViewHolder.tvSelectC, "C", select, position);}});mViewHolder.tvSelectD.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {judgeSelect(mViewHolder, mViewHolder.tvSelectD, "D", select, position);}});}private void clearSelectState(ViewHolder mViewHolder) {mViewHolder.tvSelectA.setCompoundDrawables(getDrawableResource(R.drawable.ic_select_a), null, null, null);mViewHolder.tvSelectB.setCompoundDrawables(getDrawableResource(R.drawable.ic_select_b), null, null, null);mViewHolder.tvSelectC.setCompoundDrawables(getDrawableResource(R.drawable.ic_select_c), null, null, null);mViewHolder.tvSelectD.setCompoundDrawables(getDrawableResource(R.drawable.ic_select_d), null, null, null);}private void judgeSelect(ViewHolder viewHolder, TextView text, String select, String rightSelect, int position) {//清楚之前的状态clearSelectState(viewHolder);if (select.equals(rightSelect)) {text.setCompoundDrawables(getDrawableResource(R.drawable.ic_select_right), null, null, null);} else {text.setCompoundDrawables(getDrawableResource(R.drawable.ic_select_error), null, null, null);}}@TargetApi(Build.VERSION_CODES.LOLLIPOP)private Drawable getDrawableResource(int res) {Drawable drawable = mContext.getDrawable(res);drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());return drawable;}class ViewHolder {TextView tvTitle;TextView tvSelectA;TextView tvSelectB;TextView tvSelectC;TextView tvSelectD;}}

写完这段代码信心满满,觉得没问题了,但是在手机上一运行,发现出问题了,效果如下:

是的,由于listview的布局复用机制,导致下面没有选择的条目也因为复用而选择了选项

其实解决的方法很简单,就是将这个选中的条目与该条目对应的model相关联起来,具体怎么做呢,下面来仔细的分析分析,

首先在创建model的时候添加一个默认的字段,这个字段就是你选择的选项,当然初始值是没有的,在getView中对布局进行初始化的时候,就去判断这个字段是否有值,并且值为多少,如果有值,就去判断值为正确还是为错误,为正确则替换成正确的图片,如果为错误,则替换成错误的图片,如果没有值,则显示原始的ABCD四种初始化图片,这样,问题就迎刃而解了

下面贴出完整的代码,其实就跟上面的代码是差不多的,只不过在对model中添加的那个字段进行了一些复制与判断

package com.fizzer.anbangproject_dahuo_test.Adapter;import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;import com.fizzer.anbangproject_dahuo_test.Model.ConvertModel;
import com.fizzer.anbangproject_dahuo_test.R;import java.util.List;/*** Created by Fizzer on 2016/10/8.* Email: doraemonmqq@sina.com*/
public class ConvertViewAdapter extends BaseAdapter {private List<ConvertModel> list;private Context mContext;public ConvertViewAdapter(Context context, List<ConvertModel> list) {mContext = context;this.list = list;}@Overridepublic int getCount() {if (list == null) {return 0;} else {return list.size();}}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder mViewHolder;if (convertView == null) {convertView = View.inflate(mContext, R.layout.view_upgradepartnet_topic_layout, null);mViewHolder = new ViewHolder();mViewHolder.tvTitle = (TextView) convertView.findViewById(R.id.tvTitle);mViewHolder.tvSelectA = (TextView) convertView.findViewById(R.id.tvSelectA);mViewHolder.tvSelectB = (TextView) convertView.findViewById(R.id.tvSelectB);mViewHolder.tvSelectC = (TextView) convertView.findViewById(R.id.tvSelectC);mViewHolder.tvSelectD = (TextView) convertView.findViewById(R.id.tvSelectD);convertView.setTag(mViewHolder);} else {mViewHolder = (ViewHolder) convertView.getTag();}ConvertModel module = list.get(position);mViewHolder.tvTitle.setText("Q" + (position + 1) + ":" + module.title);mViewHolder.tvSelectA.setText(module.optionA);mViewHolder.tvSelectB.setText(module.optionB);mViewHolder.tvSelectC.setText(module.optionC);mViewHolder.tvSelectD.setText(module.optionD);initListener(mViewHolder, module.rightOption, position, module);<span style="color:#cc0000;">if (TextUtils.isEmpty(module.check)) {clearSelectState(mViewHolder);} else {judgeSelect(mViewHolder, getCheckTextView(mViewHolder, module.check), module.check, module.rightOption, position);}</span>return convertView;}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}private void initListener(final ViewHolder mViewHolder, final String select, final int position, final ConvertModel module) {mViewHolder.tvSelectA.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {<span style="color:#cc0000;">module.check = "A";</span>judgeSelect(mViewHolder, mViewHolder.tvSelectA, "A", select, position);}});mViewHolder.tvSelectB.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {<span style="color:#cc0000;">module.check = "B";</span>judgeSelect(mViewHolder, mViewHolder.tvSelectB, "B", select, position);}});mViewHolder.tvSelectC.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {<span style="color:#cc0000;">module.check = "C";
</span>                judgeSelect(mViewHolder, mViewHolder.tvSelectC, "C", select, position);}});mViewHolder.tvSelectD.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {<span style="color:#cc0000;">module.check = "D";</span>judgeSelect(mViewHolder, mViewHolder.tvSelectD, "D", select, position);}});}private void clearSelectState(ViewHolder mViewHolder) {mViewHolder.tvSelectA.setCompoundDrawables(getDrawableResource(R.drawable.ic_select_a), null, null, null);mViewHolder.tvSelectB.setCompoundDrawables(getDrawableResource(R.drawable.ic_select_b), null, null, null);mViewHolder.tvSelectC.setCompoundDrawables(getDrawableResource(R.drawable.ic_select_c), null, null, null);mViewHolder.tvSelectD.setCompoundDrawables(getDrawableResource(R.drawable.ic_select_d), null, null, null);}private void judgeSelect(ViewHolder viewHolder, TextView text, String select, String rightSelect, int position) {//清楚之前的状态clearSelectState(viewHolder);if (select.equals(rightSelect)) {text.setCompoundDrawables(getDrawableResource(R.drawable.ic_select_right), null, null, null);} else {text.setCompoundDrawables(getDrawableResource(R.drawable.ic_select_error), null, null, null);}}@TargetApi(Build.VERSION_CODES.LOLLIPOP)private Drawable getDrawableResource(int res) {Drawable drawable = mContext.getDrawable(res);drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());return drawable;}<span style="color:#cc0000;">private TextView getCheckTextView(ViewHolder mViewHolder, String rightSelect) {if ("A".equals(rightSelect)) {return mViewHolder.tvSelectA;} else if ("B".equals(rightSelect)) {return mViewHolder.tvSelectB;} else if ("C".equals(rightSelect)) {return mViewHolder.tvSelectC;} else if ("D".equals(rightSelect)) {return mViewHolder.tvSelectD;}return null;}</span>class ViewHolder {TextView tvTitle;TextView tvSelectA;TextView tvSelectB;TextView tvSelectC;TextView tvSelectD;}}

其中标红的就是新添的代码,加上这些后,问题就解决了,来看一下解决后的代码运行情况:

总结:

最后来总结一下这个问题的解决思路吧:

首先就是需要在该填充器对应的实体类中添加一个选中的(check)字段,在进行getview操作中,去根据这个check字段来进行相应的操作,如过有值,则设置成对应的样式,如果没有值,则设置成没有值得样式,当然,在用户点击的时候,要及时的对该字段进行赋值,类似的,像Listview中有checkbox也可以采用同样的方法来进行解决

Android中ListView复用导致布局错乱的解决方案相关推荐

  1. java简述常见的布局极其特点_请简要说明 Android 中五种常见布局的特点。_学小易找答案...

    [简答题]请简要说明有序广播和无序广播的区别 [简答题]请简要说明 Android 程序结构中 AndroidManifest.xml 的功能? [简答题]简述李村站人工办理进路的作业过程. [简答题 ...

  2. android listview 分析,Android中ListView用法实例分析

    本文实例分析了Android中ListView用法.分享给大家供大家参考,具体如下: 通过在Layout中添加ListView Widget可以达到在页面布局具有列表效果的交互页面.在这里通过举例来说 ...

  3. android listview高级,Android中Listview点赞功能的实现

    最近这段时间一直在看Android,利用Listview去实现点赞功能,下面给大家介绍下基本思路. 基本思路: 进入界面–>获取数据–> 在Listview中显示–> 通过map集合 ...

  4. android中ListView控件onItemClick事件中获取listView传递的数据

    http://blog.csdn.net/aben_2005/article/details/6592205 本文转载自:android中ListView控件&&onItemClick ...

  5. android listview 数据同步,android中ListView数据刷新时的同步方法

    本文实例讲述了android中ListView数据刷新时的同步方法.分享给大家供大家参考.具体实现方法如下: public class Main extends BaseActivity { priv ...

  6. android 布局颜色设置颜色设置,怎么在Android中利用view设置布局颜色

    怎么在Android中利用view设置布局颜色 发布时间:2020-12-10 16:16:37 来源:亿速云 阅读:154 作者:Leah 这期内容当中小编将会给大家带来有关怎么在Android中利 ...

  7. Android中ListView选中事件setOnItemSelectedListener无反应不生效问题

    Android中ListView选中事件setOnItemSelectedListener无反应不生效问题 在学习Android中ListView组件时,android模拟器运行app时,发现点击有反 ...

  8. Android中ListView数据使用sAdapter.notifyDataSetChanged();方法不刷新的问题

    原文链接:http://blog.csdn.net/caihongdao123/article/details/51513410  点击阅读原文 ------------------------- 1 ...

  9. Android中使用ViewStub提高布局性能

    2019独角兽企业重金招聘Python工程师标准>>> 注,关于Stub的解释:在Java中,桩(stub)是指用来代替关联代码或者未实现代码的代码. ViewStub使用场景 如上 ...

  10. Android中ListView的使用以及使用适配器设置数据源

    场景 Android中使用Adapter(适配器)给RecycleView设置数据源: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detail ...

最新文章

  1. ubuntu windows 终端清理、清空 屏幕命令 清屏
  2. php 两个数组求交集_如何求两个数组的交集
  3. Nginx 学习总结(2) —— 基本配置
  4. Kotlin项目实践指南(上)
  5. 局部类型 之 部分方法
  6. makefile文件的书写规则(make和makefile)
  7. MongoDB 教程三: 高级查询
  8. 【转】SQLServer 游标简介与使用说明
  9. 实体类里的内部类怎么单独赋值_java你还在用各种setter赋值初始对象吗?用设计模式化简为易...
  10. 2018年手机摄像头模组市场调研报告
  11. python控制arduino模拟端口_用Python控制Arduino实现Blink
  12. 树与图的深度优先遍历
  13. 直接通过服务器文件相对路径实现文件下载
  14. PDF以及PPT技巧
  15. Eclipse简明使用教程(java集成开发环境)
  16. 数学建模笔记(三)论文写作:论文排版
  17. 二进制转化成ascll_怎样将二进制转ascii码
  18. 自然语言处理—文本分类综述/什么是文本分类
  19. H3C 重置cons 密码,清空配置
  20. 站长付个人支付收款平台如何收费?

热门文章

  1. 一、IOC和DI的概念
  2. IPv4正则表达式匹配
  3. Windows PowerShell是啥?看完本文你就懂它了
  4. 关于log4net 生成多个文件夹的解决方案。
  5. 数学归纳法证明求和公式
  6. 再读simpledb 之 SQL语句解析(1)
  7. 在spring中手动编写事务
  8. Python datetime 格式化字符串:strftime()
  9. 习题4-8 高空坠球(20 分)
  10. Selenium2(WebDriver)总结(一)---启动浏览器、设置profile加载插件