2017-02-17 51 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在點擊時已經記錄了它自己的選中狀態。沒有理由寫任何代碼來這樣做。 –