2013-09-10 4 views
1

Я немного борется с этим. Поэтому у меня есть расширяемый список, и я хочу сделать Edit Text для ввода данных. Я создал кнопку, чтобы я мог использовать введенные данные при активации кнопки (On Click). Также я создал представление «Редактировать текст». Но когда я хочу получить эти данные, ничего не происходит, я использую edittex.getText().toString(). Я использовал Log.i для тестирования, но logger даже не появился на logcat.Редактировать текст в расширенном списке

ExpandableListAdapter

package lt.whiteGroup.ultimateshoppinglist; 

import java.util.logging.Logger; 

import android.app.Activity; 
import android.util.Log; 
import android.util.SparseArray; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.webkit.WebView.FindListener; 
import android.widget.BaseExpandableListAdapter; 
import android.widget.Button; 
import android.widget.CheckedTextView; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MyExpandableListAdapter extends BaseExpandableListAdapter { 

    private final SparseArray<Group> groups; 
    public LayoutInflater inflater; 
    public Activity activity; 
    private Button but; 
    private EditText edittex; 


    public MyExpandableListAdapter(Activity act, SparseArray<Group> groups) { 
     activity = act; 
     this.groups = groups; 
     inflater = act.getLayoutInflater(); 
    } 

    @Override 
    public Object getChild(int groupPosition, int childPosition) { 
     return groups.get(groupPosition).children.get(childPosition); 
    } 

    @Override 
    public long getChildId(int groupPosition, int childPosition) { 
     return 0; 
    } 

    @Override 
    public View getChildView(int groupPosition, final int childPosition, 
      boolean isLastChild, View convertView, ViewGroup parent) { 
     final String children = (String) getChild(groupPosition, childPosition); 

     TextView text = null; 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.listrow_details, null); 
     } 
     text = (TextView) convertView.findViewById(R.id.textView1); 
     text.setText(children); 
//  convertView.setOnClickListener(new OnClickListener() { 
//   @Override 
//   public void onClick(View v) { 
//    Toast.makeText(activity, children, 
//      Toast.LENGTH_SHORT).show(); 
//   } 
//  }); 
     but = (Button) convertView.findViewById(R.id.Button); 
     edittex = (EditText) convertView.findViewById(R.id.ET); 

     but.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       EditText et = ((ViewGroup)v.getParent()).getChildAt(0); 
       System.out.println(et.getText().toString()); 
    //   Log.i("dsds", c); 

      } 
     }); 
     return convertView; 
    } 

    @Override 
    public int getChildrenCount(int groupPosition) { 
     return groups.get(groupPosition).children.size(); 
    } 

    @Override 
    public Object getGroup(int groupPosition) { 
     return groups.get(groupPosition); 
    } 

    @Override 
    public int getGroupCount() { 
     return groups.size(); 
    } 

    @Override 
    public void onGroupCollapsed(int groupPosition) { 
     super.onGroupCollapsed(groupPosition); 
    } 

    @Override 
    public void onGroupExpanded(int groupPosition) { 
     super.onGroupExpanded(groupPosition); 
    } 

    @Override 
    public long getGroupId(int groupPosition) { 
     return 0; 
    } 

    @Override 
    public View getGroupView(int groupPosition, boolean isExpanded, 
      View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.listrow_group, null); 
     } 
     Group group = (Group) getGroup(groupPosition); 
     ((CheckedTextView) convertView).setText(group.string); 
     ((CheckedTextView) convertView).setChecked(isExpanded); 
     return convertView; 
    } 

    @Override 
    public boolean hasStableIds() { 
     return false; 
    } 

    @Override 
    public boolean isChildSelectable(int groupPosition, int childPosition) { 
     return false; 
    } 

} 

ЛОГ

09-10 21:54:37.851: E/AndroidRuntime(1025): FATAL EXCEPTION: main 
09-10 21:54:37.851: E/AndroidRuntime(1025): java.lang.ClassCastException: android.widget.TextView 
09-10 21:54:37.851: E/AndroidRuntime(1025):  at lt.whiteGroup.ultimateshoppinglist.MyExpandableListAdapter$1.onClick(MyExpandableListAdapter.java:70) 
09-10 21:54:37.851: E/AndroidRuntime(1025):  at android.view.View.performClick(View.java:2485) 
09-10 21:54:37.851: E/AndroidRuntime(1025):  at android.view.View$PerformClick.run(View.java:9080) 
09-10 21:54:37.851: E/AndroidRuntime(1025):  at android.os.Handler.handleCallback(Handler.java:587) 
09-10 21:54:37.851: E/AndroidRuntime(1025):  at android.os.Handler.dispatchMessage(Handler.java:92) 
09-10 21:54:37.851: E/AndroidRuntime(1025):  at android.os.Looper.loop(Looper.java:130) 
09-10 21:54:37.851: E/AndroidRuntime(1025):  at android.app.ActivityThread.main(ActivityThread.java:3687) 
09-10 21:54:37.851: E/AndroidRuntime(1025):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-10 21:54:37.851: E/AndroidRuntime(1025):  at java.lang.reflect.Method.invoke(Method.java:507) 
09-10 21:54:37.851: E/AndroidRuntime(1025):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
09-10 21:54:37.851: E/AndroidRuntime(1025):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 
09-10 21:54:37.851: E/AndroidRuntime(1025):  at dalvik.system.NativeStart.main(Native Method) 

ListRowDetails Компоновка

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="40dp" 
    android:clickable="true" 
    android:orientation="vertical" 
    android:paddingLeft="40dp" 
    tools:context=".MainActivity" > 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:drawableLeft="@drawable/ic_launcher" 
     android:drawablePadding="5dp" 
     android:gravity="center_vertical" 
     android:text="@string/hello_world" 
     android:textSize="14sp" 
     android:textStyle="bold" 

     > 
    </TextView> 

    <View 
     android:layout_below="@id/textView1" 
     android:layout_width="match_parent" 
     android:layout_height="1dp" 
     android:background="@android:color/black" /> 
    <Button 
     android:id="@+id/Button" 
     android:layout_marginTop="1dp" 
     android:layout_below="@id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Add to list" 
     android:onClick="ButtonFunction" 
     /> 
    <EditText 
     android:id="@+id/ET" 
     android:layout_alignParentRight="true" 
     android:layout_toRightOf="@id/textView1" 
     android:inputType="text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:hint="Quantity" 
     /> 

</RelativeLayout> 
+1

Похоже, что вы назвали свою кнопку «Button» как «Button». Это приведет к ошибке, переименуйте ее на что-то еще, например, 'b' и используйте' b.setOnClickListener (... 'и посмотрите, поможет ли это –

+0

@EdGeorge Имя переменной кнопки не имеет к этому никакого отношения. Это переменная, которую он вызывает внутри события click. – Don

+0

Название кнопки изменено, все еще одно и то же: /. Любые другие мысли? Я думаю, что у него должно быть что-то со списком Я думаю, может быть, мне нужно определить, какой отредактированный editText редактируется? – whiteLT

ответ

1

Вы не можете захватить значение произвольно созданного/добавленного вида. В вашем событии onClick edittex ссылается на переменную класса EditText edittex (которая никогда не инициализируется/не используется BTW). Поскольку прослушиватель onClick будет вызываться в неопределенное время, это не так, как вы должны ссылаться на свое поле EditText. Если у вас есть следующий макет:

<LinearLayout> 
    <EditText /> 
    <Button /> 
</LinearLayout> 

Вы должны сделать что-то, что не полагается на переменные, которые были инициализированы вне onClickListener, как это:

// Make sure to that you are referencing the button variable and not the Button class here 
    yourButton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      EditText et = (EditText) ((ViewGroup)v.getParent()).getChildAt(0); 
      System.out.println(et.getText().toString()); 
      // You can use the logger if you want, but I always find it easier to use System.out if I'm just printing out one value. 
     } 
    }); 

Explination:

В общем, при использовании ExpandableListView, ListView или любого другого представления, которое позволяет добавить к нему произвольное количество просмотров, я считаю, что проще всего перейти к родительскому элементу щелкнутого представления, чтобы найти любой сиб взглядов. Вы не можете ссылаться на локальную переменную, которая была объявлена ​​внутри другого метода. Итак, эта строка: String c = edittex.getText().toString(); на самом деле ссылается на переменную EditText edittex, которая имеет класс (тот, который вы указали в верхней части класса). Эта переменная либо: a) никогда не инициализируется, либо b) это значение перезаписывается последующим вызовом метода. Таким образом, когда вы ссылаетесь на него, вы не ссылаетесь на переменную, которая, по вашему мнению, вы есть.

Чтобы преодолеть это, все, что вам нужно сделать, это использовать View, который передается как параметр, чтобы получить родительский элемент, который содержит его (который является подклассом ViewGroup, если у вас есть аналогичный макет, который я показал вам пример). После этого вы можете получить доступ к любому из дочерних представлений родителя с помощью метода getChildAt(). В этом случае я предполагаю, что представление EditText является первым дочерним представлением родительского (то есть в 0-м индексе). При необходимости отрегулируйте индекс.

Кроме того, эта строка: Button.setOnClickListener(new OnClickListener() { должна быть именем вашей переменной Button, а не классом Button.

+0

Хорошо, спасибо, проверяя ваш код сейчас, в среднем, хотя вы не могли бы объяснить эту строку: EditText et = ((ViewGroup) v.getParent()). GetChildAt (0); Почему мы используем ViewGroup и child в 0? – whiteLT

+0

@whiteLT Я просто положил туда. Имеют смысл? – Don

+0

Да, большое спасибо за ваше объяснение, действительно помогли! Но теперь eclipse хочет, чтобы я добавил кастинг в вашу строку кода. Я обновил свой код выше. Если я добавлю литье, я получу силу Закрыть – whiteLT

Смежные вопросы