ListView不刷新

时间:2016-07-01 09:49:30

标签: java android listview

我想创建一个ListView并动态添加项目。这是我的代码:

CustomAdapter.java:

public class CustomAdapter extends ArrayAdapter<Item>{

    Context context;
    int layoutResourceId;
    LinearLayout linearMain;
    ArrayList<Item> data = new ArrayList<Item>();

    public CustomAdapter(Context context, int layoutResourceId,
                              ArrayList<Item> data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;

        if (row == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);

            linearMain = (LinearLayout) row.findViewById(R.id.lineraMain);

            Item myImage = data.get(position);

            TextView label = new TextView(context);
            label.setText(myImage.name);
            linearMain.addView(label);

            ImageView image = new ImageView(context);
            int outImage = myImage.image;
            image.setImageResource(outImage);
            linearMain.addView(image);
        }
        return row;
    }
}

Item.java:

public class Item {

    int image;
    String name;

    public Item(int image, String name) {
        super();
        this.image = image;
        this.name = name;
    }
    public int getImage() {
        return image;
    }
    public void setImage(int image) {
        this.image = image;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

GallerF.java

 ArrayList<Item> imageArry = new ArrayList<Item>();
 CustomAdapter adapter;
 ListView dataList;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.activity_gallery, parent, false);
    dataList = (ListView) v.findViewById(R.id.lista);

    return v;
}
.....
public void CreateNewListRow(){
    imageArry.add(new Item(R.drawable.ek_logo,name));
    adapter = new CustomAdapter(getActivity(),R.layout.list,imageArry);
    dataList.setAdapter(adapter);
    adapter.notifyDataSetChanged();
}

list.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/lineraMain"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:padding="10dp" >
</LinearLayout>

activity_gallery.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="hu.redbuttonebb.endi.fragmentek20.GalleryF"
    android:background="@drawable/background"
    android:id="@+id/linlayout">

    <ScrollView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <ListView
            android:id="@+id/lista"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:drawSelectorOnTop="false" />

    </ScrollView>
</LinearLayout>

现在,当我运行应用程序时,它会使用正确的图片和名称创建一行。但是,当我想创造一个,那么没有任何事情发生。我在哪里做错了?

3 个答案:

答案 0 :(得分:2)

用以下文件替换您的文件:

ArrayList<Item> imageArry = new ArrayList<Item>();
CustomAdapter adapter;
ListView dataList;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.activity_gallery, parent, false);
dataList = (ListView) v.findViewById(R.id.lista);

adapter = new CustomAdapter(getActivity(),R.layout.list,imageArry);
dataList.setAdapter(adapter);

return v;
}
.....

public void CreateNewListRow(){
imageArry.add(new Item(R.drawable.ek_logo,name));
imageArry.add(new Item(R.drawable.ek_logo,name));
imageArry.add(new Item(R.drawable.ek_logo,name));
imageArry.add(new Item(R.drawable.ek_logo,name));
imageArry.add(new Item(R.drawable.ek_logo,name));
adapter.notifyDataSetChanged();
}

使用以下代码编辑list.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/lineraMain"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="10dp" >
</LinearLayout>

删除ScrollView,ListView不需要ScrollView:

 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:paddingBottom="@dimen/activity_vertical_margin"
      android:paddingLeft="@dimen/activity_horizontal_margin"
      android:paddingRight="@dimen/activity_horizontal_margin"
      android:paddingTop="@dimen/activity_vertical_margin"
      tools:context="hu.redbuttonebb.endi.fragmentek20.GalleryF"
      android:background="@drawable/background"
      android:id="@+id/linlayout">
<ListView
    android:id="@+id/lista"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:drawSelectorOnTop="false" />

</LinearLayout>

答案 1 :(得分:1)

每次要添加项目时都要创建新的适配器。您需要在适配器中创建一个方法,并在添加项目时调用该方法,如下所示:

public void CreateNewListRow(){
    adapter.addItem(new Item(R.drawable.ek_logo,name));
}

并将CreateNewListRow更改为:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.activity_gallery, parent, false);
    dataList = (ListView) v.findViewById(R.id.lista);

    adapter = new CustomAdapter(getActivity(),R.layout.list,imageArry);
    dataList.setAdapter(adapter);

    return v;
}

并将您的onCreate更改为:

<html>
<!-- HTML code is here -->    
<input type='hidden' name = 'runningno' id='runningno' value = '<?php print $runningno; ?>'></input>
<!-- Some other html -->
<?php

//your php code here
?>
<!-- HTML again -->
</html>

答案 2 :(得分:1)

  

将此方法添加到Adapter&amp;将Adapter扩展到BaseAdapter

public class FriendsAdapter extends BaseAdapter {

Activity context;
ArrayList<String> data = new ArrayList<>();
LayoutInflater inflater;

public FriendsAdapter(Activity c) {

    context = c;
    inflater = LayoutInflater.from(this.context);
}

public void add(String item) {

    try {
        data.add(item);
    } catch (Exception e) {

        e.printStackTrace();
    }
    notifyDataSetChanged();
}

public void remove(int position) {

    try {
        data.remove(data.get(position));

    } catch (Exception e) {

        e.printStackTrace();
    }
    notifyDataSetChanged();
}


@Override
public int getCount() {
    return data.size();
}

@Override
public String getItem(int position) {
    return data.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder holder;

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.list_item_friends, parent, false);
        holder = new ViewHolder();

        holder.tvUserName = (TextView) convertView.findViewById(R.id.tvUserName);

        convertView.setTag(holder);

    } else {

        holder = (ViewHolder) convertView.getTag();

    }

    try {

        holder.tvUserName.setText(data.get(position));

    } catch (Exception e) {
        e.printStackTrace();
    }
    return convertView;
}

private class ViewHolder {

    TextView tvUserName;

}}
  

初始化适配器

FriendsAdaoter adapter = new FriendsAdapter(this);
list.setAdapter(adapter);
adapter.add("ABCDEFGHIJKL");