2011-12-15 2 views
0

Привет, У меня возникли проблемы с попыткой получить представление списка, которое я создал, чтобы добавить все, что есть входы пользователя в представление 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()); 
     } 

    }); 

} 

Данные.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., независимо от того, что я получаю сообщение об ошибке. имеет ли значение, что я изменил его в файле манифеста на 7? Последнее, что я убрал в проекте, но это не имеет значения - в чем проблема?

+0

Не могли бы вы опубликовать реализацию пользовательского адаптера? Это может быть полезно :) – kyp

+0

... и трассировка стека :-) – gwa

+0

да ... это было бы здорово ^^ – kyp

ответ

1

Я реализовал код и он работает отлично :)

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())); 
     } 
    }); 
} 
0

Я думаю, что проблема в onClick. Область видимости переменных неверна. Ссылка на «данные» не привязана к родительскому классу. То же самое с «edit».

Вместо этого он привязан к новому OnClickListner и поэтому не определен.

Попробуйте изменить его ссылку на родительский класс, используя

ParentClasName.this.data.add(ParentClasName.this.edit.getText().toString()); 

Просто замените «ParentClassName» с именем вашего класса.

+0

нет ... это не проблема ... Доступ к полям класса отлично работает, в то время как реализация внутреннего класса (слушателя) – kyp

+0

hmmm. может быть, он не звонит adapter.notifyDataSetChanged()? Но это просто ничего не сделает, а не рушится. @ Katana42: Post Stack следы пожалуйста –

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