2012-04-26 71 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; 
    } 

以获取选中的单选按钮。 谢谢。

相关问题