2012-04-26 69 views
1

我正在使用基於BasedAdapter的自定義ListAdapter定製ListView。我的ListView產品有ToggleButtonEditText。在使用此ListView的活動中,我有一個名爲SaveButton。當我點擊Save時,該活動必須找到一些方法來從ListView獲取數據,以便使用此功能做一些事情。如何從自定義ListView中獲取數據以在Activity中使用?

在自定義ListView適配器,我使用ArrayList跟蹤變化DataItem,與代表了ListView項目(包含了ToggleButton一個boolean變量和EditText文本一String)模型。 問題是,當我點擊Save時,我必須以某種方式從適配器中獲取ArrayList的數據,該數據庫也包含每個列表項中的更新數據EditTextToggleButton

我該怎麼做?

回答

3

通常情況下,您將是將此適配器設置到ListView中的人。您只需將此適配器的實例保存到Activity中的成員變量中即可。適配器已經提供了訪問單個項目的方法。您可以添加更多方法來獲取數據。事情是這樣的:

public class MyAdapter extends BaseAdapter { 
    List data; 
    ...... 

    public boolean[] getCheckStates() { 
     //get values of your checkboxes here 
    } 

    public String[] getTexts() { 
     //get text of your text boxes here 
    } 

    // implement all other methods of BaseAdapter 
} 

然後在你的活動:

這裏
public class MyActivity extends Activity { 
    MyAdapter adapter; 

    public onCreate(Bundle instance) { 
     ..... 
     adapter = new MyAdapter(...); 
     ... 
     myList.setAdapter(adapter); 
     ... 
     btnSave.setOnClickListener(new OnClickListener() { 
      public void onClick (View v) { 
       boolean[] checks = adapter.getCheckStates(); 
       String[] texts = adapter.getTexts(); 
       .... 
      } 
     }); 
    } 

    ........ 
} 
+0

感謝Aleks G. – toantran 2012-04-27 02:39:26

0

喜是什麼ü需要:

public class MusicTrack extends Activity { 
private ArrayAdapter<CardDetails> listAdapter ; 
ArrayList<Boolean> itemChecked = new ArrayList<Boolean>(); 
CardDetailsAdapter mListAdapter; 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    final ArrayList<CardDetails> cardResults = GetCardDetails(); 
    for (int i = 0; i < cardResults.size(); i++) { 
     System.out.println("card redsults: " + cardResults.get(i).isSelected()); 
    } 
    final ListView welcomelist = (ListView) findViewById(R.id.welcomelistID); 

    listAdapter = new CardDetailsAdapter(this, cardResults); 
    welcomelist.setAdapter(listAdapter);  

    final Button saveBtn = (Button) findViewById(R.id.saveID); 
    saveBtn.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      // get the checkbox status and save related details into database 
     // Intent intent = new Intent(MusicTrack.this, TransactionSummaryActivity.class); 
      itemChecked = mListAdapter.itemChecked1;  
      System.out.println("item checked: " + itemChecked); 

      for (int i = 0; i < cardResults.size(); i++) { 
       System.out.println("cardResults and checked status: " + cardResults.get(i).getText()); 
       System.out.println("cardResults and checked status111: " + cardResults.get(i).isSelected()); 
      } 
     } 
    }); 

} 
private ArrayList<CardDetails> GetCardDetails() { 

    ArrayList<CardDetails> carddetailresults = new ArrayList<CardDetails>(); 
    CardDetails sr1 = new CardDetails(); 

     sr1.setText("Text1"); 
     sr1.setSelected(false); 
     carddetailresults.add(sr1); 

     sr1 = new CardDetails(); 
     sr1.setText("Text2"); 
     sr1.setSelected(true); 
     carddetailresults.add(sr1); 

     sr1 = new CardDetails(); 
     sr1.setText("Text3"); 
     sr1.setSelected(true); 
     carddetailresults.add(sr1); 

     sr1 = new CardDetails(); 
     sr1.setText("Text4"); 
     sr1.setSelected(true); 
     carddetailresults.add(sr1); 

     sr1 = new CardDetails(); 
     sr1.setText("Text5"); 
     sr1.setSelected(false); 
     carddetailresults.add(sr1); 

    return carddetailresults; 
}} 
class CardDetails{ 
String text; 
Boolean selected; 
public String getText() { 
    return text; 
} 

public void setText(String bankName) { 
    text = bankName; 
} 

public boolean isSelected() { 
     return selected; 
    } 

    public void setSelected(boolean selected) { 
     this.selected = selected; 
    }} 


class CardDetailsAdapter extends ArrayAdapter<CardDetails> { 
private static ArrayList<CardDetails> searchArrayList; 
public static ArrayList<Integer> alSelCards = new ArrayList<Integer>(); 
public static ArrayList<Boolean> itemChecked1 = null; 
private LayoutInflater mInflater; 

protected Context getContext; 
public CardDetailsAdapter(Context context, ArrayList<CardDetails> results) { 
     super(context, R.layout.webview, R.id.textID, results); 
     // Cache the LayoutInflate to avoid asking for a new one each time. 
     searchArrayList = results; 
     getContext = context; 
     mInflater = LayoutInflater.from(context) ; 
     itemChecked1 = new ArrayList<Boolean>(); 
     for (int i = 0; i < results.size(); i++) { 
      itemChecked1.add(i, results.get(i).isSelected()); // initializes all items value with 

     } 
    } 

public int getCount() { 
    if (searchArrayList != null) 
     return searchArrayList.size(); 
    return 0; 
} 

public CardDetails getItem(int position) { 

    return searchArrayList.get(position); 
} 

public long getItemId(int position) { 
    return position; 
} 

public View getView(final int position, View convertView, 
     final ViewGroup parent) { 
    CardDetails planet = (CardDetails) this.getItem(position); 
     final ViewHolder holder; 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.webview, null); 
      holder = new ViewHolder(); 
      holder.text = (TextView) convertView.findViewById(R.id.textID); 
      holder.chkbox = (ToggleButton) convertView.findViewById(R.id.togID); 

      convertView.setTag(holder); 

      holder.text.setText(searchArrayList.get(position).getText()); 
      holder.chkbox.setTag(planet); 
      holder.chkbox.setChecked(planet.isSelected()); 

     } else { 
      holder = (ViewHolder) convertView.getTag(); 
      ViewHolder viewHolder = (ViewHolder) convertView.getTag(); 
      holder.chkbox = viewHolder.getCheckBox(); 
      holder.text = viewHolder.getText(); 

      holder.text.setText(searchArrayList.get(position).getText()); 
      holder.chkbox.setTag(planet); 

      holder.chkbox.setChecked(planet.isSelected()); 

     } 
     holder.chkbox.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       ToggleButton cb = (ToggleButton) v; 
       CardDetails planet = (CardDetails) cb.getTag(); 
       //planet.setSelected(cb.isChecked()); 
       if (holder.chkbox.isChecked()) { 
        itemChecked1.set(position, true); 
        holder.chkbox.setChecked(true); 
        planet.setSelected(true); 


       } else if (!holder.chkbox.isChecked()) { 
        itemChecked1.set(position, false); 
        holder.chkbox.setChecked(false); 
        planet.setSelected(false); 
       } 
      } 
     }); 

     return convertView; 
    } 

    public static class ViewHolder { 
     private ToggleButton chkbox; 
     TextView text; 

     public ViewHolder() { 
     } 

     public ViewHolder(TextView text, ToggleButton chkbox) { 
      this.chkbox = chkbox; 
      this.text = text; 
     } 

     public ToggleButton getCheckBox() { 
      return chkbox; 
     } 

     public void setCheckBox(CheckBox checkBox) { 
      this.chkbox = chkbox; 
     } 

     public TextView getText() { 
      return text; 
     } 

     public void setText(TextView text) { 
      this.text = text; 
     } 

    }} 

進口所需要的東西

+0

首先,我想感謝您的支持,這對您很好。在您的適配器中,您可以預先設置EditText的文本值。沒問題,我第一次加載。但我的問題,當用戶更改EditText中的文本(在每個ListView項目中)。我必須將這個新輸入的文本更新回適配器中存儲信息的ArrayList(對應於ListView中的項目位置)。我嘗試EditText的「onFocusChanged」事件。但是還有更多問題出現。 (也許我會在另一個帖子中問他們)。 – toantran 2012-04-27 02:37:28

0

是的,那是正確的。 另外,要獲得radioButton checkedId你需要創建一個onCkeckedChangeListener並在那裏設置checkedId。之後,覆蓋以下方法

public int[] getChkId() { 
     return chkId; 
    } 

以獲取選中的單選按鈕。 謝謝。

相關問題