Android - 列表项不会立即刷新

标签 android listview android-activity

我创建了一个类 Activity ,然后继承了两个 Activity 。它看起来如下:

public abstract class VlcMediaPlayerList extends RoboActivity {
    public final static int AUDIO = 1;
    public final static int VIDEO = 2; 

    @InjectView(R.id.audio_list_view)
    ListView listView;

    public static ArrayList<ImageWithTwoText> list = new ArrayList<ImageWithTwoText>();

    public ImageWithTwoTextArrayAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_vlc_media_player_list);
        adapter = new ImageWithTwoTextArrayAdapter(this, list);
        listView.setAdapter(adapter);

        addListenerOnItemList();

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);
        if (intent != null) {
            Bundle extras = intent.getExtras();
            ImageWithTwoText file = null;
        try {
            file = (ImageWithTwoText) extras.getSerializable(FileChooserAcitivity.FILE_TYPE);
        } catch (NullPointerException ex) {
        }
        Log.i("FILECHOOSER", String.valueOf(list.size()));
        if (file != null) {
        list.add(file);
        }

        adapter.notifyDataSetChanged();
    }

    }

    /**
     * Add File method called when addButton is clicked. Start activity
     * FileChooserActivity for result as file
     * 
     * @param ImageButton
     *            view
     */
    public void addFile(View view) {
        Intent intent = new Intent(this, FileChooserAcitivity.class);
        intent.putExtra(FileChooserAcitivity.FILE_TYPE, getMediaType());
        startActivityForResult(intent, getMediaType());
    }

    /**
     * Clear the list when clearButton is clicked
     * 
     * @param View
     *            view
     */
    public void clearList(View view) {
        list.clear();
        adapter.notifyDataSetChanged();
        Toast.makeText(this, getResources().getString(R.string.clear_list), Toast.LENGTH_SHORT).show();
    }

    /**
     * Add listener on list
     */
    public void addListenerOnItemList() {
    listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {

        Intent intent = new Intent(view.getContext(),
            PlayerActivity.class);
        intent.putExtra(PlayerActivity.PLAYER_ELEMENT,
            list.get(position).getTitle());
        startActivity(intent);
        }
    });
    }

    protected abstract int getMediaType();
}

一个扩展抽象类的类如下:

public class VlcMediaPlayerAudio extends VlcMediaPlayerList {

    @Override
    protected int getMediaType() {
        return VlcMediaPlayerList.AUDIO;
    }

}

问题发生在调用 onActivityResult() 之后,它获取了表示列表元素的 ImageWithTwoText 对象。在调用 adapter.notifyDataSetChanged() 之后,这个元素并没有被添加到列表中。 笔记!退出 Activity (返回键)并重新进入同一 Activity 后,先前添加的元素已经在列表中

这是 ImageWithTwoTextArrayAdapter 的代码:

public class ImageWithTwoTextArrayAdapter extends ArrayAdapter<String> {
    public final static String TITLE_KEY = "title";
    public final static String SUBTITLE_KEY = "subtitle";
    public final static String IMAGE_RESOURCE_KEY = "imageResources";

    private final List<ImageWithTwoText> imageWithTwoTextList;
    private final Context context;

    /**
    * Class constructor
    * 
    * @param context
    */
        public ImageWithTwoTextArrayAdapter(Context context, List<ImageWithTwoText> imageWithTwoTextList) {
    super(context, R.layout.row_view, getArrayListOfTitles(imageWithTwoTextList));
    this.context = context;
    this.imageWithTwoTextList = imageWithTwoTextList;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View rowView = inflater.inflate(R.layout.row_view, parent, false);
    TextView titleView = (TextView) rowView.findViewById(R.id.title);
TextView subTitleView = (TextView) rowView.findViewById(R.id.subtitle);
    ImageView imageView = (ImageView) rowView.findViewById(R.id.icon);

    ImageWithTwoText currentElement = imageWithTwoTextList.get(position);

    titleView.setText(currentElement.getTitle());
    subTitleView.setText(currentElement.getSubTitle());
    imageView.setImageResource(currentElement.getImageResource());

    return rowView;
}

private static List<String> getArrayListOfTitles(List<ImageWithTwoText> imageWithTwoTextList) {
    List<String> listOfTitles = new ArrayList<String>();

    for (ImageWithTwoText imageWithTwoText : imageWithTwoTextList) {
    listOfTitles.add(imageWithTwoText.getTitle());
}

return listOfTitles;
}

最佳答案

我认为问题出在适配器的构造函数中,您正在这样调用基本构造函数:

super(context, R.layout.row_view, getArrayListOfTitles(imageWithTwoTextList));

这是传递

的结果
getArrayListOfTitles() 

到适配器存储的基础列表,它是您提供的列表的副本。这意味着您在 Activity 中对列表所做的更改不会对适配器持有的列表副本进行。

啊,您的评论比我的编辑快了大约一分钟!很高兴问题解决了!

关于Android - 列表项不会立即刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20287734/

相关文章:

android - java.lang.NullPointerException : Attempt to invoke virtual method 'int android.view.View.getImportantForAccessibility()' on a null object reference

java - 通过运行 AsyncTask 处理方向变化

android - 如何避免回到之前的 Activity

android - 命令 'react-native log-android' 卡在 'Starting Logkitty'

android - 解析,两种不同的用户类型

MenuItem 上的 Android 工具提示

android - ListView:动态更改 sibling 的数据

c# - ListView ItemDataBound - 确定项目是否为 AlternatingItem?

android - 有没有办法用 Espresso 测试 Chrome 自定义标签?

java - 由于 'getFragmentManager()' 和 'android.preference.PreferenceFragment' 都已弃用,我该如何替换我的代码?