【问题标题】:return Changed arrayList from adapter android从适配器android返回更改的arrayList
【发布时间】:2015-02-10 12:07:40
【问题描述】:

有 gridview 用于设置名为 ImageAdapter 的适配器,参数为 arraylist。在适配器内部有 onclicklistener,在此期间从 arraylist 中删除一个项目,然后当我在 gridview 项目中使用这一行 ImageAdapter.notifyDataSetChanged 时被删除。现在我需要在我的活动中更改数组列表,所以我怎样才能得到它。

这是我的代码:

public class ImageAdapter extends BaseAdapter {
Context context;
ArrayList<String> listCheck = new ArrayList<String>(); 
ImageAdapter adapter = this;

    public ImageAdapter(Context context, ArrayList<String> list) { 
    this.context = context; 
    listCheck = list; 
}    
    @Override
public int getCount() {
    return listCheck.size();
}

    @Override
public Object getItem(int arg0) {
    return null; 
}

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

    @Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    ViewHolder121 holder;
    if (convertView == null) {
        convertView = LayoutInflater.from(context).inflate(         
        R.layout.item_gridmain, null);  
        holder = new ViewHolder121();
        holder.imageView = (ImageView) convertView
                    .findViewById(R.id.img_selected_image); 
       holder.close = (ImageButton) convertView
                    .findViewById(R.id.img_btn_cancel); 
        convertView.setTag(holder);     
}

        else { 
        holder = (ViewHolder121) convertView.getTag();
    } 
    holder.close.setOnClickListener(new View.OnClickListener() {    
    public void onClick(View arg1) {
                listCheck.remove(position);
                adapter.notifyDataSetChanged();
 }  
}); Bitmap bm = decodeSampledBitmapFromUri(listCheck.get(position), 220,
                220);   
holder.imageView.setImageBitmap(bm);    
        return convertView; 
}       }

片段代码:

ImageAdapter mainActivityAdapter = new ImageAdapter(getActivity(), ar1);    
                 gridview_withimage.setAdapter(mainActivityAdapter);

问题:如何将数组列表从 ImageAdapter 更改为被调用的 Fragment

【问题讨论】:

    标签: java android gridview arraylist


    【解决方案1】:

    如何将数组列表从 ImageAdapter 更改为被调用的 Fragment

    在ImageAdapter 中创建一个方法,该方法将返回用作适配器中数据源的 ArrayList:

    public ArrayList<String> getModifyList() {
        return listCheck; 
    }
    

    在Fragment中调用getModifyList方法,使用Adapter对象获取ArrayList:

    gridview_withimage.setAdapter(mainActivityAdapter);
    gridview_withimage.postDelayed(new Runnable() {
    
     @Override
      public void run() {
     // TODO Auto-generated method stub
        ArrayList<String> arrNewList=mainActivityAdapter.getModifyList();           
      }
     }, 100);
    

    【讨论】:

    • 我已经尝试过了,但我希望这个函数返回 arraylist onclick of clear button
    • holder.close.setOnClickListener(new View.OnClickListener() { public void onClick(View arg1) { listCheck.remove(position); adapter.notifyDataSetChanged(); } });
    • 单击关闭按钮后,listCheck 值将从相应位置删除,那么如何将此更改后的 listCheck 获取到我的片段?
    • @Anitha: 当你想要改变片段中的 listCheck 值时?
    • 调用 setAdapter 后,我需要更改后的数组列表
    【解决方案2】:

    您可以将 Fragment 实例传递给 Adapter。

    private Fragment fragment;
    
    public ImageAdapter(Context context, ArrayList<String> list,Fragment mfragment) { 
        this.context = context; 
        listCheck = list; 
        this.fragment=mfragment;
    } 
    

    并在您的片段中创建一个公共方法并使用片段片段的此实例进行调用;

    【讨论】:

      【解决方案3】:

      你可以创建这样的界面

      public interface ImageAdapterListener{
          void onListChange(List<String> list);
      }
      

      并在ImageAdapter中声明一个成员

      private ImageAdapterListener listener;
      
      public setListener(ImageAdapterListener listener){
      this.listener = listener}
      

      覆盖 notifyDataSetChanged

      @Override
      void notifyDataSetChanged{
      super.notifyDataSetChanged();
      if(listener!= null) listener.onListChange(listCheck);
      }
      

      并让您的片段实现该接口。

      class Myfragment extends Fragment implements ImageAdapterListener {
      ImageAdapter mainActivityAdapter = new ImageAdapter(getActivity(), ar1);    
                       gridview_withimage.setAdapter(mainActivityAdapter);
      mainActivityAdapter.setListener(this);
      
      @Override 
      void onListChange(List<String> list){
      //do your stuff
      }
          }
      

      【讨论】:

      • 虽然看起来安全简单,但它会在适配器中的每一次数据更改上传递一个列表吗?
      • 如果你总是在更新数据后调用 notifyDataSetChanged 那么是,否则不是。这是一个旧答案,我建议您检查 recyclerview 适配器的通知方法
      • 谢谢,我使用了类似的界面解决方案,但没有 notifyDataSetChanged,只需单击按钮即可。
      猜你喜欢
      • 2019-06-12
      • 2015-03-28
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      相关资源
      最近更新 更多