我是Android的新手,我在使用自定义类扩展ListView
向BaseAdapter
添加项目时遇到了麻烦。
所以,我有MainActivity
的菜单,可以选择Add List Item
。它会启动名为InputDataActivity
的新活动:
public boolean onOptionsItemSelected(MenuItem item) {
Intent i = new Intent(this,InputDataActivity.class);
startActivityForResult(i,1);
return super.onOptionsItemSelected(item);
}
InputDataActivity
包含两个EditText's
,允许输入Name
和Surname
。还有与方法Button
相关联的AddPerson
:
public void AddPerson(View view)
{
Intent data = new Intent();
data.putExtra("name",editText1.getText().toString());
data.putExtra("surname",editText2.getText().toString());
setResult(RESULT_OK,data);
finish();
}
然后,再次,在MainActivity
中有:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
personListAdapter.AddElem(data.getStringExtra("name"), data.getStringExtra("surname"));
}
PersonListAdapter
是从BaseAdapter
扩展的适配器。在我展示它的代码之前,有几个重要的事情。 Person
是一个允许保存数据的简单类:Name
和Surname
。我还创建了名为list_element_layout
的自定义布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/nameAndSurname"
android:drawableLeft="@android:drawable/btn_star_big_on"
android:drawableStart="@android:drawable/btn_star_big_on"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="40sp"/>
</LinearLayout>
好的,我们已经获得了自定义适配器的代码:
public class PersonListAdapter extends BaseAdapter{
private List<Person> personList =new ArrayList<>();
private LayoutInflater layoutInflater; //do tworzenia klasy z XML'a
public PersonListAdapter(LayoutInflater inflater)
{
this.layoutInflater=inflater;
}
public void AddElem(String name, String surname)
{
personList.add(new Person(name, surname));
}
@Override
public int getCount() {
return personList.size();
}
@Override
public Object getItem(int position) {
return personList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView==null)
{
convertView=layoutInflater.inflate(R.layout.list_element_layout,parent,false); //zapytac o to false
Person person = personList.get(position);
TextView nameAndSurname = (TextView)convertView.findViewById(R.id.nameAndSurname);
String textToWrite=person.getName()+" "+person.getSurname();
nameAndSurname.setText(textToWrite);
}
return convertView;
}
}
MainActivity
OnCreate
我已添加:
protected void onCreate(Bundle savedInstanceState) {
...
ListView personListView=(ListView)findViewById(R.id.listView);
personListAdapter=new PersonListAdapter(LayoutInflater.from(this));
personListView.setAdapter(personListAdapter);
}
现在,事情是:我输入一对:Name
,Surname
在我的第二个活动中,我点击一个按钮将数据发送回{{ 1}},然后我使用我的适配器更新我的MainActivity
。
我不知道为什么,但它第一次没有工作(我想要添加到列表中的第一项),并且没有&#39;没有&#39;工作&#39;我的意思是,没有错误,但它会回到MainActivity并且没有任何内容添加到ListView
但是每隔一段时间它就能正常工作!
答案 0 :(得分:1)
我不知道你拨打notifyDataSetChanged()
的地方。试试这个:
public void AddElem(String name, String surname)
{
personList.add(new Person(name, surname));
notifyDataSetChanged();
}
每次修改personList
数组列表时,都需要调用notifyDataSetChanged()
答案 1 :(得分:0)
试试这个:
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView==null)
{
convertView=layoutInflater.inflate(R.layout.list_element_layout,parent,false);
}
Person person = personList.get(position);
TextView nameAndSurname = (TextView)convertView.findViewById(R.id.nameAndSurname);
String textToWrite=person.getName()+" "+person.getSurname();
nameAndSurname.setText(textToWrite);
return convertView;
}
答案 2 :(得分:0)
它没有工作的原因很简单。这是因为Coordinate Layout
。由于我是Android
的新用户,我在将ListView
应用于API低于21的应用程序时,我并不知道它存在一些问题。我设法将其添加到{{} 1}}文件XML
以某种方式对我有用,但是如果我要做一些更严肃的事情,我将不得不考虑有关问题的教程。