2011-07-15 42 views
0

我真的不知道从哪里开始问这个问题,所以我只是试图描述我的问题最好的我可以...我目前正在使用自定义List使2个文本视图和复选框充气的适配器。一个textView是该选项的描述,其中另一个textView在我需要使用它显示数据时保存。当用户点击列表中的一个项目时,它将弹出一个editText对话框。我得到它来保存文本并显示它,但我遇到的问题是,当它显示数据时,它不在正确的ListView项目上...例如:http://www.vbsteven.be/blog/wp-content/uploads/2009/07/screenshotcalllog.png 说如果我想显示信息I从listView的第一个槽中的对话框中获得。它随机显示在第3或第2位或第4位。这似乎是这样一个简单的问题,但我一直在挣扎了一会儿......Android ListView定位为TextView

xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <TextView android:id="@+id/rowTextView" 
    android:layout_width="wrap_content" 
    android:layout_height="70dp" 
    android:padding="12dp" 
    android:textSize="16sp" > 
    </TextView> 

    <TextView android:id="@+id/alarm_name_text" 
    android:layout_height="wrap_content" 
    android:text="" 
    android:layout_toRightOf="@+id/rowTextView" 
    android:layout_width="fill_parent"> 
    </TextView> 

    <CheckBox android:id="@+id/CheckBox01" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:padding="10dp" 
    android:layout_alignParentRight="true" android:layout_marginRight="6sp" 
    android:focusable="false"> 
    </CheckBox> 

</RelativeLayout> 

活动:

@Override 
    protected Dialog onCreateDialog(int id) { 
     switch (id) { 
     case DIALOG_TEXT_ENTRY: 

      LayoutInflater mInflater = LayoutInflater.from(this); 
      final View textEntryView = mInflater.inflate(
        R.layout.alert_text_entry, null); 
      /*final View textEntryView1 = mInflater.inflate(R.layout.row, null);*/ 
      final EditText savedText = ((EditText)textEntryView.findViewById(R.id.password_edit)); 
      final TextView rowSavedText = ((TextView)findViewById(R.id.alarm_name_text)); 
      return new AlertDialog.Builder(AlarmList.this) 
        .setIcon(R.drawable.alert_icon) 
        .setTitle("Enter your name") 
        .setView(textEntryView) 
        .setPositiveButton("accept", 
          new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface dialog, 
             int which) { 
            String temp = savedText.getText().toString(); 
            rowSavedText.setText(temp); 
            rowSavedText.setVisibility(0); 
           } 
          }) 
        .setNegativeButton("Cancel", new OnClickListener() { 
         public void onClick(DialogInterface dialog, int which) { 

         } 
        }).create(); 
     } 
     return null; 
    } 

如果任何人希望看到我的代码的任何其他部分的帮助,请让我知道。提前致谢!

下面有我的列表适配器和数据在它:用于显示行星对象数组

planets = new Planet[] { new Planet("Turn On Alarm"), 
        new Planet("Alarm Name"), new Planet("Time"), 
        new Planet("Sound"), new Planet("Vibrate"), 
        new Planet("Repeat"), new Planet("Volume Control"), 
        new Planet("Second Alarm") }; 
     } 
     ArrayList<Planet> planetList = new ArrayList<Planet>(); 
     planetList.addAll(Arrays.asList(planets)); 


listAdapter = new PlanetArrayAdapter(this, planetList); 

/**定义适配器。 */ 私有类PlanetArrayAdapter扩展ArrayAdapter {

private LayoutInflater inflater; 
    public PlanetArrayAdapter(Context context, List<Planet> planetList) { 
     super(context, R.layout.row, R.id.rowTextView, planetList); 

     // Cache the LayoutInflate to avoid asking for a new one each time. 
     inflater = LayoutInflater.from(context); 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // Planet to display 
     Planet planet = (Planet) this.getItem(position); 


     // The child views in each row. 
     CheckBox checkBox; 
     TextView textView; 
     Spinner mySpinner; 


// Create a new row view 
      if (convertView == null) { 
       convertView = inflater.inflate(R.layout.row, null); 

       // Find the child views. 
       textView = (TextView) convertView 
         .findViewById(R.id.rowTextView); 
       checkBox = (CheckBox) convertView.findViewById(R.id.CheckBox01); 
       // Optimization: Tag the row with it's child views, so we don't 
       // have to 
       // call findViewById() later when we reuse the row. 
       convertView.setTag(new PlanetViewHolder(textView, checkBox)); 

       // If CheckBox is toggled, update the planet it is tagged with. 
       checkBox.setOnClickListener(new View.OnClickListener() { 
        public void onClick(View v) { 
         CheckBox cb = (CheckBox) v; 
         Planet planet = (Planet) cb.getTag(); 
         planet.setChecked(cb.isChecked()); 
        } 
       }); 
      } 
      // Reuse existing row view 
      else { 
       // Because we use a ViewHolder, we avoid having to call 
       // findViewById(). 
       PlanetViewHolder viewHolder = (PlanetViewHolder) convertView 
         .getTag(); 
       checkBox = viewHolder.getCheckBox(); 
       textView = viewHolder.getTextView(); 
      } 

      // Tag the CheckBox with the Planet it is displaying, so that we can 
      // access the planet in onClick() when the CheckBox is toggled. 
      checkBox.setTag(planet); 

      // Display planet data 
      checkBox.setChecked(planet.isChecked()); 
      textView.setText(planet.getName()); 

      return convertView; 
     } 

回答

1

不要以为你可以从对话视图设置这些textviews。您必须从您的自定义列表适配器中设置它们。从您的对话框中获取名称,然后将名称添加到自定义适配器的数据集中,最后再次设置适配器或notifyDataSetChanged()。

+0

我不太明白你的意思。如果我怎么能从dialogView中获取名称,那么在范围之外使用它?另外,我是否应该在getView()方法中设置我的TextViews?当我添加数据集时,我是否将其传入?或者只是定义一段数据。对不起,我对android很陌生,在我的大学我们没有任何老师。 – cj1098

+2

从对话框中获取文本,然后将其添加到您的ArrayList或适用于您的适配器的任何结构中,当您添加它时,调用YourCursor.notifyDataSetChanged(),然后光标将重新填充listview并从对话框中获取数据在你的列表视图中。不要忘记调用YourCursor.notifyDataSetInvalidated();这会导致listview重绘自己,包括新数据。 我敢打赌,这是你正在尝试做的。 –

+0

有什么方法可以聊天吗?你说的实际上是有道理的,我只是不知道如何添加该字符串。 – cj1098