简体   繁体   中英

add item to listview by edittext

i have edittext and button and list view, i want to add item to listview from edittext, when i click on button text from edittext add to listview but this error will appear "Unfortunately, List has stopped."

> main.xml code is:

<EditText 
    android:id="@+id/EdtInput"
    android:layout_width="250dp"
    android:layout_height="wrap_content"
    android:hint="@string/StInput"
    />
<Button 
    android:id="@+id/BtnAdd"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/StAdd"
    android:layout_toRightOf="@+id/EdtInput"
    />

<ListView 
    android:id="@+id/LstItem"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_below="@+id/EdtInput"
    android:layout_alignLeft="@+id/EdtInput"
    ></ListView>

> MainActivity.java code is:

package com.saly.list;

import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final EditText ET=(EditText) findViewById(R.id.EdtInput);
    final String StInput=ET.getText().toString();
    final ListView LV=(ListView) findViewById(R.id.LstItem);
    final ArrayList<String> ArLi=new ArrayList<String>();
    final ArrayAdapter<String> ArAd=new ArrayAdapter<String>(this, R.layout.main,ArLi);
    LV.setAdapter(ArAd);
    Button Add=(Button) findViewById(R.id.BtnAdd);
    Add.setOnClickListener(new OnClickListener() {          
        public void onClick(View v) {
            ArLi.add(StInput);
            ArAd.notifyDataSetChanged();
            ET.setText("");
        }       
    });     
}
}

This is the LogCat error:

02-27 16:44:06.369: I/Adreno-EGL(21719): <qeglDrvAPI_eglInitialize:320>: EGL 1.4 QUALCOMM Build: I0404c4692afb8623f95c43aeb6d5e13ed4b30ddbDate: 11/06/13
02-27 16:44:06.409: D/OpenGLRenderer(21719): Enabling debug mode 0
02-27 16:44:12.515: E/ArrayAdapter(21719): You must supply a resource ID for a TextView
02-27 16:44:12.515: D/AndroidRuntime(21719): Shutting down VM
02-27 16:44:12.515: W/dalvikvm(21719): threadid=1: thread exiting with uncaught exception (group=0x41836ba8)
02-27 16:44:12.525: E/AndroidRuntime(21719): FATAL EXCEPTION: main
02-27 16:44:12.525: E/AndroidRuntime(21719): Process: com.saly.list, PID: 21719
02-27 16:44:12.525: E/AndroidRuntime(21719): java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:386)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.widget.AbsListView.obtainView(AbsListView.java:2263)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.widget.ListView.makeAndAddView(ListView.java:1790)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.widget.ListView.fillDown(ListView.java:691)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.widget.ListView.fillFromTop(ListView.java:752)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.widget.ListView.layoutChildren(ListView.java:1616)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.widget.AbsListView.onLayout(AbsListView.java:2091)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.view.View.layout(View.java:14817)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.view.ViewGroup.layout(ViewGroup.java:4631)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1055)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.view.View.layout(View.java:14817)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.view.ViewGroup.layout(ViewGroup.java:4631)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.view.View.layout(View.java:14817)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.view.ViewGroup.layout(ViewGroup.java:4631)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:374)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.view.View.layout(View.java:14817)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.view.ViewGroup.layout(ViewGroup.java:4631)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.view.View.layout(View.java:14817)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.view.ViewGroup.layout(ViewGroup.java:4631)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1987)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1744)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.view.Choreographer.doCallbacks(Choreographer.java:574)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.view.Choreographer.doFrame(Choreographer.java:544)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.os.Handler.handleCallback(Handler.java:733)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.os.Handler.dispatchMessage(Handler.java:95)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.os.Looper.loop(Looper.java:136)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.app.ActivityThread.main(ActivityThread.java:5017)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at java.lang.reflect.Method.invokeNative(Native Method)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at java.lang.reflect.Method.invoke(Method.java:515)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
02-27 16:44:12.525: E/AndroidRuntime(21719):    at dalvik.system.NativeStart.main(Native Method)
02-27 16:44:12.525: E/AndroidRuntime(21719): Caused by: java.lang.ClassCastException: android.widget.RelativeLayout cannot be cast to android.widget.TextView
02-27 16:44:12.525: E/AndroidRuntime(21719):    at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:379)
02-27 16:44:12.525: E/AndroidRuntime(21719):    ... 40 more

Move final String StInput=ET.getText().toString(); in your onClick method.

Add.setOnClickListener(new OnClickListener() {          
    public void onClick(View v) {
        String StInput= ET.getText().toString();
        if(StInput != null && StInput.length() > 0){
            ArLi.add(StInput);
            ArAd.notifyDataSetChanged();
            ET.setText("");
        }else{
           //EditText is blank
        }
    }       
}); 

EDIT - Please add this.

ArrayAdapter<String> ArAd=new ArrayAdapter<String>(this,  android.R.layout.simple_list_item_1,android.R.id.text1,ArLi);

I believe you are using a simple list of Strings. The issue is with your layout you are passing it as you have passed your main layout there. Change it to above and let know if this works.

I am saving the edittext value in DB and instantly showing it in list here is my code

    mEditProblem.setOnClickListener(new OnClickListener() {
                    public void onClick(View v) {
                       // calculate();
                        saveContentToDb();
                    }
                });

            mEditProblem.setOnFocusChangeListener(new View.OnFocusChangeListener() {          

                    public void onFocusChange(View v, boolean hasFocus) {
                        if(!hasFocus){
                           // calculate();
                            //if (event != null&& (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
                                InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                                in.hideSoftInputFromWindow(mEditProblem.getApplicationWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
                           // }
    //                      saveContentToDb();
                        }
                    }
                });


public void saveContentToDb(){

        newlyAddedText = mEditProblem.getText().toString();
        Toast.makeText(getApplicationContext(), mEditProblem.getText().toString(), 0).show();
        itemData.add(new ItemRow(mEditProblem.getText().toString(),getResources().getDrawable(R.drawable.ic_launcher) ));
        adapter.notifyDataSetChanged();
        mEditProblem.setText("");



    }

You're getting the text when the app first loads. It's never updated. You need to get the text when the button event is raised.

public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final EditText ET=(EditText) findViewById(R.id.EdtInput);
    final ListView LV=(ListView) findViewById(R.id.LstItem);
    final ArrayList<String> ArLi=new ArrayList<String>();
    final ArrayAdapter<String> ArAd=new ArrayAdapter<String>(this, R.layout.main,ArLi);
    LV.setAdapter(ArAd);
    Button Add=(Button) findViewById(R.id.BtnAdd);
    Add.setOnClickListener(new OnClickListener() {          
        public void onClick(View v) {
            ArLi.add(ET.getText().toString());
            ArAd.notifyDataSetChanged();
            ET.setText("");
        }       
    });     
}
}

Your ListView displays data stored in your ArLi variable. What you need to to is add the string as you did. That part works just fine.

Your problem is that you get the text from the EditText before the button is clicked. Hence clicking the button will always add nothing (or the default value of the EditText . To get the text in the box upon clicking the button you need to change your OnClickListener as follows:

Add.setOnClickListener(new OnClickListener() {          
    public void onClick(View v) {
        String input = ET.getText().toString();
        if(input != null && input != "")
        {
            ArLi.add(ET.getText().toString());
            ArAd.notifyDataSetChanged();
            ET.setText("");
        }
    }       
});

Note that I presume you don't want to add null or an empty string. Adjust as needed. I would also strongly advise that you take a look at Java coding practices. Variables should start with a lower letter. Also, writing concrete variable names instead of abbreviations will help to make your code more readable.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM