Android 如何维护列表视图行/项的位置?
我有一个自定义的Android 如何维护列表视图行/项的位置?,android,listview,checkbox,android-imageview,Android,Listview,Checkbox,Android Imageview,我有一个自定义的列表视图,其中包含文本视图,图像视图,复选框。在列表视图中不应选中/取消选中任何内容,因为我必须根据条件对其进行阻止 我正在做的任务: 如果选中了复选框,则应在图像视图中显示图像 我不想根据条件使复选框可检查/启用 下面是我的自定义适配器代码 public class CustomAdapter extends BaseAdapter { private Context context; private ArrayList<POJ
列表视图
,其中包含文本视图
,图像视图
,复选框
。在列表视图中
不应选中/取消选中任何内容,因为我必须根据条件对其进行阻止
我正在做的任务:
复选框
,则应在图像视图
中显示图像复选框
可检查/启用 public class CustomAdapter extends BaseAdapter {
private Context context;
private ArrayList<POJO> mainDataList;
private LayoutInflater inflater = null;
public CustomAdapter(Context context, ArrayList< POJO > mainDataList) {
this.context = context;
this.mainDataList = mainDataList;
inflater = ( LayoutInflater ) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mainDataList.size();
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public POJO getItem(int position) {
// TODO Auto-generated method stub
return mainDataList.get(position);
}
public class Holder
{
private TextView name;
private ImageView imageView;
private CheckBox check;
}
@Override
public View getView(final int position, View view, ViewGroup parent) {
// TODO Auto-generated method stub
final Holder holder;
if (view == null) {
holder = new Holder();
view = inflater.inflate(R.layout.my_layout_file, null);
holder.name = (TextView) view.findViewById(R.id.textView_Name);
holder.imageView = (ImageView) view.findViewById(R.id.img);
holder.check = (CheckBox) view.findViewById(R.id.checkBox);
view.setTag(holder);
} else {
holder = (Holder) view.getTag();
}
holder.check.setTag(position);
if (mainDataList.get(position).isEditable()) {
holder.check.setEnabled(false);
holder.check.setClickable(false);
} else {
holder.check.setEnabled(true);
holder.check.setClickable(true);
}
}
holder.name.setText(mainDataList.get(position).getName());
holder.check.setChecked(mainDataList.get(position).isSelected());
if (mainDataList.get(position).isSelected())
holder.imageView.setImageResource(R.drawable.ic_launcher);
else
holder.imageView.setImageResource(null);
return view;
}
}
公共类CustomAdapter扩展了BaseAdapter{
私人语境;
私有ArrayList主数据列表;
专用充气机=空;
公共CustomAdapter(上下文,ArrayListmainDataList){
this.context=上下文;
this.mainDataList=mainDataList;
充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回mainDataList.size();
}
@凌驾
公共长getItemId(int位置){
//TODO自动生成的方法存根
返回位置;
}
@凌驾
公共POJO getItem(内部位置){
//TODO自动生成的方法存根
返回mainDataList.get(位置);
}
公共类持有者
{
私有文本视图名称;
私人影像视图;
私人复选框检查;
}
@凌驾
公共视图getView(最终整数位置、视图视图、视图组父视图){
//TODO自动生成的方法存根
最终持有人;
如果(视图==null){
保持架=新保持架();
视图=充气机.充气(R.layout.my_layout_文件,空);
holder.name=(TextView)view.findViewById(R.id.TextView\u name);
holder.imageView=(imageView)view.findViewById(R.id.img);
holder.check=(CheckBox)view.findViewById(R.id.CheckBox);
视图.设置标签(支架);
}否则{
holder=(holder)view.getTag();
}
支架.检查.设置标签(位置);
if(mainDataList.get(position.isEditable()){
holder.check.setEnabled(假);
保持架。检查。可点击设置(错误);
}否则{
holder.check.setEnabled(真);
保持架。检查。可点击设置(真);
}
}
holder.name.setText(mainDataList.get(position.getName());
holder.check.setChecked(mainDataList.get(position.isSelected());
if(mainDataList.get(position.isSelected())
holder.imageView.setImageResource(R.drawable.ic_启动器);
其他的
holder.imageView.setImageResource(空);
返回视图;
}
}
我的问题是:
ImageView
随机显示图像,与真实情况无关我知道这是维护列表项位置或滚动列表视图循环的问题。如何执行此操作?您有以下情况:
if (mainDataList.get(position).isSelected())
holder.imageView.setImageResource(R.drawable.ic_launcher);
这意味着,如果模型将其属性选择为true
,它将为图像视图设置一些图像资源。问题在于,无论何时滚动并isSelected()
产生false
,您都不会做任何事情。因为您正在使用这些视图,所以您会得到一些旧视图,这些视图在某些时候已将isSelected()
设置为true。它当前可能是false
,但您尚未为此指定任何条件
我的建议是,你应该在以下方面做一些事情:
if (mainDataList.get(position).isSelected())
{
holder.imageView.setImageResource(R.drawable.ic_launcher);
}
else
{
holder.imageView.setImageResource(null);
}
您有以下情况:
if (mainDataList.get(position).isSelected())
holder.imageView.setImageResource(R.drawable.ic_launcher);
这意味着,如果模型将其属性选择为true
,它将为图像视图设置一些图像资源。问题在于,无论何时滚动并isSelected()
产生false
,您都不会做任何事情。因为您正在使用这些视图,所以您会得到一些旧视图,这些视图在某些时候已将isSelected()
设置为true。它当前可能是false
,但您尚未为此指定任何条件
我的建议是,你应该在以下方面做一些事情:
if (mainDataList.get(position).isSelected())
{
holder.imageView.setImageResource(R.drawable.ic_launcher);
}
else
{
holder.imageView.setImageResource(null);
}
@Sushildh已经尝试SparseBooleanArray了。请分享建设性意见您有条件地调用
setImageResource
:您必须在else
子句中“清除”它,同时也要清除持有者的东西:它只会弄乱代码,其好处几乎与zero@pskink请看我的edits@sushildlh已尝试SparseBooleanArray。请分享建设性意见您有条件地调用setImageResource
:您必须在else
子句中“清除”它,同时也要清除持有者的东西:它只会弄乱代码,其好处几乎与zero@pskink请看我的编辑