允许用户从EditText添加到ListView



嗨,我一直有一些麻烦,试图得到一个列表视图,我创建了添加任何它是用户输入到EditText视图。内容应该在用户按下添加按钮时添加,但程序只是崩溃,更不用说运行缓慢了。我没有在下面添加全部代码,只添加了我认为相关的部分。

public class ListViewActivity_Two extends Activity 
{
EditText edit;          Button add;
final List<String> data = new ArrayList<String>();
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    data.add( "Hello" );
    edit = ( EditText )findViewById( R.id.editTxt ); 
    add = ( Button ) findViewById( R.id.add );
    add.setOnClickListener( new OnClickListener() 
    {
        @Override
        public void onClick(View v) 
        {
            data.add( edit.getText().toString() );
        }
    }); 
    /**
    for( int i = 1; i <= 10; i++ )
    {
        data.add( String.format( "Item %d", i ) );
    }
    */
    // Declare an instance of our custom adapter class
    CustomAdapter adapter = new CustomAdapter( this, data );
    ListView listView = ( ListView )findViewById( android.R.id.list ); 
    listView.setAdapter( adapter );
    listView.setOnItemClickListener( new OnItemClickListener()
    {
        @Override
        public void onItemClick( AdapterView listview, View v, int pos, long id ) 
        {
            TextView textView = (TextView)v.findViewById( android.R.id.text1 );
            toast( (String) textView.getText() );
        }
    });
}

data.add()只是在那里确保我可以添加到ListView,我可以。我在onClickButton中做了同样的事情那么为什么会发生这种情况呢?此外,我是正确的声明onCreate方法上面的视图的创建,或者他们必须在它正确工作吗?

编辑

这是CustomAdapter类

package com.stylingandroid.listview;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public class CustomAdapter extends BaseAdapter
{
private final Context context;
private final List<String> items;
public CustomAdapter( Context context, List<String> items )
{
    this.context = context;
    this.items = items;
}
@Override
public int getCount() 
{   
    return items.size();
}
@Override
public Object getItem(int position) 
{
    return items.get( position );
}
@Override
public long getItemId(int position) 
{
    return getItem( position ).hashCode();
}
/**
 * Method getView() below is inefficent because inflating XML layouts is memory expensive
 * because it involves parsing XML and then instantiating objects to represent all of the Views
 * in the view hierarchy
 * 
 * see: http://blog.stylingandroid.com/archives/632
 * 
 * for more details.
 * 
 * The more efficient code is below it!

@Override
public View getView( int position, View convertView, ViewGroup parent ) 
{
    LayoutInflater inflater = ( LayoutInflater )context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
    View v = inflater.inflate( R.layout.item, parent, false );
    final String item = ( String ) getItem( position );
    TextView tv = ( TextView )v.findViewById( android.R.id.text1 );
    tv.setText( item );
    ImageView iv = ( ImageView )v.findViewById( R.id.imageView );
    iv.setOnClickListener( new OnClickListener() 
    {
        @Override
        public void onClick(View v) 
        {
            Toast.makeText( context, String.format( "ImageClicked: %s", item ), Toast.LENGTH_SHORT ).show();
        }
    });
    return v;
}
*/
@Override
public View getView( int position, View convertView, ViewGroup parent ) 
{
    /**
     * this method differs from the one above because, here, all we are doing is inflating a new view
     * if convertView is null. This significantly reduces the amount of object deletion and instantiation
     * that's required, and vastly improves our scrolling performance particularly on low powered devices
     */
    View v = convertView;
    if( v == null )
    {
        LayoutInflater inflater = ( LayoutInflater )context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
        v = inflater.inflate( R.layout.item, parent, false );
    }
    final String item = ( String ) getItem( position );
    TextView tv = ( TextView )v.findViewById( android.R.id.text1 );
    tv.setText( item );
    ImageView iv = ( ImageView )v.findViewById( R.id.imageView );
    iv.setOnClickListener( new OnClickListener() 
    {
        @Override
        public void onClick(View v) 
        {
            Toast.makeText( context, String.format( "ImageClicked: %s", item ), Toast.LENGTH_SHORT ).show();
        }
    });
    return v;
}
}

顺便说一句,我试图改变模拟器的程序启动到API级别7;这完全毁了整个项目。现在在每一个r,无论什么,我得到一个错误。我在Manifest文件中更改为7也有关系吗?最后一件事,我清理了项目,但这没有什么区别——这里有什么问题?

我实现了一些代码,它工作得很好:)

ListView mListView;
EditText mValue;
Button mAdd;
List<String> data = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.act_listview);
    data.add("Hello World");
    mListView = (ListView) findViewById(R.id.custom_list);
    mValue = (EditText) findViewById(R.id.text_to_add);
    mAdd = (Button) findViewById(R.id.add_string);
    mListView.setAdapter(new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, data));
    mAdd.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View currentView) {
            data.add(new String(mValue.getText().toString()));
        }
    });
}

我认为问题是在onClick。变量的作用域不对。对"data"的引用不局限于父类。"edit"也是一样。

它的作用域是新的onclicklistener,因此是未定义的。

尝试使用

将其更改为引用父类
ParentClasName.this.data.add(ParentClasName.this.edit.getText().toString());

只需将"ParentClassName"替换为您的类名。

最新更新