【问题标题】:How to reload Base Adapter from getView method如何从 getView 方法重新加载基本适配器
【发布时间】:2014-04-01 21:18:06
【问题描述】:

单击按钮时我需要重新加载适配器。但是我该怎么做呢?我的代码如下。

public class CustomGridAdapter extends BaseAdapter {

private Context context;
//private final String[] gridValues;
ArrayList<Bitmap> arrayList;
ImageButton i1;

//Constructor to initialize values
public CustomGridAdapter(Context context, ArrayList<Bitmap> ob) {
    arrayList = ob;
    this.context = context;
    // this.gridValues     = gridValues;
}

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

@Override
public Object getItem(int position) {

    return null;
}

@Override
public long getItemId(int position) {

    return 0;
}

public View getView( int position,  View convertView,  ViewGroup parent) {
    final int pos = position;
    // LayoutInflator to call external grid_item.xml file

    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View gridView;

    if (convertView == null) {

        gridView = new View(context);

        // get layout from grid_item.xml ( Defined Below )

        gridView = inflater.inflate(R.layout.grid_item, null);
        ImageView imageView = (ImageView) gridView
                .findViewById(R.id.grid_item_image);

        imageView.setImageBitmap(arrayList.get(position));
        ImageButton imageButton = (ImageButton) gridView
                .findViewById(R.id.imageButton);
        imageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Log.d("myLogs", "Yes, onclick "+pos);
                arrayList.remove(pos);
                 !!!THERE I NEED TO RELOAD IT
            }
        });
    } else {

        gridView = (View) convertView;
    }

    return gridView;
}

}

【问题讨论】:

    标签: android gridview android-listview baseadapter


    【解决方案1】:

    首先,您必须设置事件并在您的活动中使用它...您必须修改您的适配器并向其添加OnClickListener attr:

    private Context context;
    private OnClickListener listener;
    ArrayList<Bitmap> arrayList;
    ImageButton i1;
    
    //Constructor to initialize values
    public CustomGridAdapter(Context context, ArrayList<Bitmap> ob, OnClickListener listener) {
        arrayList = ob;
        this.context = context;
        this.listener = listener;
    }
    

    然后要设置您的setOnClickListener,您必须执行以下操作:

    imageView.setImageBitmap(arrayList.get(position));
    ImageButton imageButton = (ImageButton) gridView
                .findViewById(R.id.imageButton);
    imageButton.setOnClickListener(listener);
    

    然后,在你的java中,你需要让你的activity实现OnClickListener,然后重写onClickListener方法,在这里你可以使用下面的方法重新加载你的列表:

    @Override
    public void onClick(View v) {   
            adapter = new CustomGridAdapter(MyActivity.this, myArrayListWithMyData, MyActivity.this);
    
            listView.setAdapter(adapter);
    
            listView.invalidate();
    }
    

    要设置适配器,您可以将上下文(例如this)作为OnClickListener 的参数传递:

    adapter = new CustomGridAdapter(this, myArrayListWithMyData, this);
    

    希望对你有帮助!

    【讨论】:

    • imageButton.setOnClickListener(context);这一行不好
    • 是的,我无法处理另一个类中的按钮 onClick
    • 我明白了,这是我的错误。我编辑了我的答案,你现在可以检查一下吗?
    【解决方案2】:

    我相信你可以使用 NotifyDataSetChanged();并且应该重新加载数据。

    【讨论】:

    【解决方案3】:

    您的代码的问题是您的列表正在重用旧视图,并且当视图被重用时,不会为当前视图重新注册侦听器,因为您仅在创建新视图(未重用)时才注册侦听器。使用下面的代码:

    ...    
    if (convertView == null) {
                    gridView = new View(context);
                    // get layout from grid_item.xml ( Defined Below )
                    gridView = inflater.inflate(R.layout.grid_item, null);
                } else {
                    gridView = (View) convertView;
                }
                ImageView imageView = (ImageView) gridView.findViewById(R.id.grid_item_image);
                imageView.setImageBitmap(arrayList.get(position));
                ImageButton imageButton = (ImageButton) gridView.findViewById(R.id.imageButton);
                imageButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Log.d("myLogs", "Yes, onclick " + pos);
                        arrayList.remove(pos);
                        notifyDataSetChanged();
                    }
                });
        ...
    

    有关使用和优化ListView的更多详细信息,请参阅this Blog

    【讨论】:

      猜你喜欢
      • 2020-09-13
      • 2015-05-17
      • 1970-01-01
      • 2015-06-24
      • 1970-01-01
      • 2013-04-26
      • 1970-01-01
      相关资源
      最近更新 更多