2017-02-17 54 views
0

我在CheckTextView中的“记住”Checkboxes状态时遇到了问题。 现在,当我点击时,它会改变状态,但在不同的CheckBox上。CustomAdapter - CheckedTextView

class CustomAdapterSmartwatch extends ArrayAdapter<String> { 


static class ViewHolder { 
    protected CheckedTextView cTextView; 
} 

ViewHolder holder; 


public CustomAdapterSmartwatch(Context context, ArrayList<String> variables) { 
    super(context,R.layout.row_smartwatch_resources,variables); 
} 

@NonNull 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     holder = new ViewHolder(); 
     LayoutInflater smartwatchinflater = LayoutInflater.from(getContext()); 
     convertView = smartwatchinflater.inflate(R.layout.row_smartwatch_resources,parent,false); 
     holder.cTextView = (CheckedTextView) convertView.findViewById(R.id.row_smartwatch_checked); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.cTextView.setText(getItem(position)); 

    holder.cTextView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (holder.cTextView.isChecked()) { 
       holder.cTextView.setChecked(false); 
      } else { 
       holder.cTextView.setChecked(true); 
      } 
     } 
    }); 

    return convertView; 
} 

}

现在我想用持有人弄清楚,但我听说,有可能使用SparseBooleanArray。有人可以解释如何使其工作?

编辑1 好吧,我有ListView是由CustomAdapter控制。该适配器只包含1个项目(CheckedTextView)。 问题是,滚动这些复选框后,不记得他们的状态。 我看到了你的答案和解释,但现在点击任何“CheckedTextView”后,其复选框的状态不会改变。

EDIT 2

@NonNull 
@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     holder = new ViewHolder(); 
     LayoutInflater smartwatchinflater = LayoutInflater.from(getContext()); 
     convertView = smartwatchinflater.inflate(R.layout.row_smartwatch_resources,parent,false); 
     holder.cTextView = (CheckedTextView) convertView.findViewById(R.id.row_smartwatch_checked); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.cTextView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Log.d("MainActivity","Position = " + position); 
      CheckedTextView checkedText = (CheckedTextView) v; 
      checkedState.put(position, !checkedText.isChecked()); 

      Log.d("MainActivity","State = " + checkedState.get(position)); 

     } 
    }); 

    holder.cTextView.setText(getItem(position)); 
    holder.cTextView.setChecked(checkedState.get(position)); 

    return convertView; 
} 

编辑3

class CustomAdapterSmartwatch extends ArrayAdapter<String> { 

public SparseBooleanArray checkedState = new SparseBooleanArray(); 
private CheckedTextView cTextView; 


public CustomAdapterSmartwatch(Context context, ArrayList<String> variables) { 
    super(context,R.layout.row_smartwatch_resources,variables); 
} 

@NonNull 
@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    LayoutInflater smartwatchinflater = LayoutInflater.from(getContext()); 
    convertView = smartwatchinflater.inflate(R.layout.row_smartwatch_resources,parent,false); 
    cTextView = (CheckedTextView) convertView.findViewById(R.id.row_smartwatch_checked); 

    cTextView.setText(getItem(position)); 
    cTextView.setChecked(checkedState.get(position)); 

    cTextView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Log.d("MainActivity","Position = " + position); 
      CheckedTextView checkedText = (CheckedTextView) v; 
      checkedText.toggle(); 

      if (checkedText.isChecked()) 
       checkedState.put(position,true); 
      else 
       checkedState.delete(position); 
      Log.d("MainActivity","State = " + checkedState.get(position)); 

     } 
    }); 
    return convertView; 
} 

}

+0

您的编辑更适合作为我的回答评论或作为一个新问题。 –

回答

0

你必须保持一个布尔标志为每个CheckTextView。这可以是一个数组,List或SparseBooleanArray。数据结构选择应该是你的适配器的领域:

class CustomAdapterSmartwatch extends ArrayAdapter<String> { 
    private SparseBooleanArray checkedState = new SparseBooleanArray(); 

    // ... 
} 

你不想把它的持有人,因为持有人退休只有FR可见行。另一方面,您希望保持每行的检查状态,可见与否。

现在,您设置的存储选中状态,当用户点击一个CheckedTextView

@NonNull 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // ... 

    holder.cTextView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      CheckedTextView checkedText = (CheckedTextView)v; 
      checkedState.put(position, checkedText.isChecked()); 
     } 
    }); 
} 

你恢复的选中状态,只要你吹一个角度还是从持有人重用一个:

@NonNull 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // ... 

    holder.cTextView.setText(getItem(position)); 
    holder.cTextView.setChecked(checkedState.get(position)); 

    // ... 
} 
+0

检查我的编辑(最佳答案) – Ace

+0

@Ace当我加载此页面时,我的答案是“top”答案。请注意,SO会根据投票重新排序答案,并将那些并列的答案随机化。 –

+0

我的意思是我问了一个问题的帖子;) – Ace

-1

替换以下更新您的代码:

class CustomAdapterSmartwatch extends ArrayAdapter<CustomAdapterSmartwatch.MyPojo> { 

    class MyPojo { 
     boolean checked; 
     String data; 

     public boolean isChecked() { 
      return checked; 
     } 

     public void setChecked(boolean checked) { 
      this.checked = checked; 
     } 

     public String getData() { 
      return data; 
     } 

     public void setData(String data) { 
      this.data = data; 
     } 
    } 

    static class ViewHolder { 
     protected CheckedTextView cTextView; 
    } 

    ViewHolder holder; 


    public CustomAdapterSmartwatch(Context context, ArrayList<MyPojo> variables) { 
     super(context, R.layout.row_smartwatch_resources, variables); 
    } 

    @Nullable 
    @Override 
    public MyPojo getItem(int position) { 
     return super.getItem(position); 
    } 

    @NonNull 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      holder = new ViewHolder(); 
      LayoutInflater smartwatchinflater = LayoutInflater.from(getContext()); 
      convertView = smartwatchinflater.inflate(R.layout.row_smartwatch_resources,parent,false); 
      holder.cTextView = (CheckedTextView) convertView.findViewById(R.id.row_smartwatch_checked); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     final MyPojo item = getItem(position); 

     holder.cTextView.setText(item.getData()); 
     holder.cTextView.setChecked(item.isChecked()); 

     holder.cTextView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       boolean nextStatus = !item.isChecked(); 
       item.setChecked(nextStatus); 
       holder.cTextView.setChecked(nextStatus); 
      } 
     }); 

     return convertView; 
    } 
} 
+0

找到ArrayAdapter(上下文,INT,ArrayList的) 构造ArrayAdapter.ArrayAdapter(上下文,INT,INT)没有合适的构造方法是不适用 (自变量不匹配; ArrayList的不能被转换为int) 构造 但是ArrayList的不能改变。 – Ace

+0

将构造函数更改为'CustomAdapterSmartwatch(上下文上下文,ArrayList 变量)' –

+0

请解释您对OP代码的更改如何解决他的问题。 –

-1

您可以简单地使用视图onClick()方法本身。

holder.cTextView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if(v instanceOf CheckedTextView) { 
       CheckedTextView c = (CheckedTextView) v; 
       c.setChecked(!c.isChecked()); 
      } 
     } 
    }); 
+0

由于您只为CheckedTextView实例设置了此侦听器,因此没有理由执行'instanceOf'。另外,CheckedTextView在点击时已经记录了它自己的选中状态。没有理由写任何代码来这样做。 –