2016-06-11 84 views
1

我有一个自定义ListView包含TextView,ImageView, Checkbox。在ListView,没有什么应该检查/取消选中,因为我必须根据条件来阻止它。如何维护列表视图行/项目的位置?

任务我做:

  1. 如果Checkbox被选中,那么它应该显示的图像中ImageView

  2. 我不想让CheckBox根据条件进行检查/启用。

下面是我的自定义适配器代码。

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

我的问题是:

  1. 在滚动,ImageView显示图像随机不论TRUE状态。

  2. 在滚动上,每4-5个列表项目/行项目无法检查后(我的设备在屏幕上显示4-5个单元格/行/项目而不滚动),因为项目1是不可检查的。简单地说,它根据getView()机制进行检索。

我知道这是在滚动时维护列表项目位置或ListView的回收问题。这个怎么做?

+0

@sushildlh已经尝试过SparseBooleanArray。请分享建设性的意见 – VVB

+1

你有条件地调用'setImageResource':你必须在'else'子句中“清除”它,并且摆脱那个持有者的东西:它只会混淆代码,它的好处几乎等于零 – pskink

+0

@ pskink请参阅我的编辑 – VVB

回答

0

你有一个条件,如:

if (mainDataList.get(position).isSelected()) 
      holder.imageView.setImageResource(R.drawable.ic_launcher); 

这意味着如果该模型有其属性选择true它会设置一些图像资源的图像视图。问题出在这个事实之下,每当你滚动和​​得到false,你什么都不做。因为您正在重新使用这些视图,所以您会看到一些旧的视图,这些视图在某些时候具有​​的真实性。它目前可能是false,但您尚未为此指定任何条件。

我的建议是,你做的东西方面:

if (mainDataList.get(position).isSelected()) 
{ 
    holder.imageView.setImageResource(R.drawable.ic_launcher); 
} 
else 
{ 
    holder.imageView.setImageResource(null); 
} 
+0

请参阅我的编辑 – VVB

相关问题