簡體   English   中英

如何從適配器獲取itemList.size()或itemList到MainActivity

[英]How to get itemList.size() or itemList from Adapter to MainActivity

從代碼段中,我記錄了一些調試點,並發現mImages.size()在不同位置提供了不同的輸出。 不管mImages.seize()的值mImages.seize() ,它始終在public ArrayList<Uri> getImageUris()返回0

public class ImagesAdapter extends RecyclerView.Adapter<ImagesAdapter.ImageViewHolder> {

    private ArrayList<Image> mImages;
    private ArrayList<Uri> mImagesUri = new ArrayList<>();
    private Image mimage;
    private Uri uris;

    private static final String TAG = "ImagesAdapter";

    public ImagesAdapter(ArrayList<Image> images) {
        mImages = images;

        if (mImages == null)
            Log.d(TAG, "ImagesAdapter mImages = null");
    }

    @Override
    public ImageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        return new ImageViewHolder(LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_pic_update, parent, false));

    }

    @Override
    public void onBindViewHolder(ImageViewHolder holder, final int position) {
        holder.bind(mImages.get(position));
        holder.cancel.setOnClickListener(view -> {
            int rpos = holder.getAdatpterpos();
            removeAt(rpos, mImages.get(position).getSource());

            Log.d(TAG, "imagesAdapter position = " + position);
        });
    }

    @Override
    public int getItemCount() {

        Log.d(TAG, "imagesAdapter getItemCount = " + mImages.size());
        return mImages.size();


    }


    public class ImageViewHolder extends RecyclerView.ViewHolder {

        protected ImageView imageView;
        private ImageButton cancel;

        public ImageViewHolder(View itemView) {
            super(itemView);

            imageView = itemView.findViewById(R.id.news_pic_update_details);
            cancel = itemView.findViewById(R.id.cancel_image);
        }

        public void bind(Image image) {

            imageView.setImageBitmap(image.getImage());
            imageView.setImageURI(image.getSource());

            Log.d(TAG, "imagesAdapter bind successful");

        }

        public int getAdatpterpos() {
            return getAdapterPosition();
        }

    }


    public void removeAt(int position, Uri path) {
        String mPath = null;
        File filepath;
        File mfilepath = null;

        try {
            mPath = path.toString();
            filepath = new File(mPath);
            mfilepath = new File(filepath.getAbsolutePath());
            mfilepath.delete();
        } catch (Exception e) {

            Log.e(TAG, "No Delete !!" + mPath + mfilepath);
            e.printStackTrace();
        }

        mImages.remove(position);
        notifyItemRemoved(position);
        notifyItemRangeChanged(position, mImages.size());
        Log.d(TAG, "remove size = " + mImages.size());
        notifyDataSetChanged();

    }
        public ArrayList<Uri> getImageUris() {// here mImages.size is always 0

            if (!mImages.isEmpty()) {

                Log.d(TAG, "getImagesUris != Null \n mImages.size() = " + mImages.size());

                for (Image imageuri : mImages) {
                    uris = imageuri.getSource();

                    mImagesUri.add(uris);
                }
                Log.d(TAG, "getImagesUris != Null" + mImagesUri);

                return mImagesUri;


            } else

                Log.d(TAG, "getImagesUris = Null \n mImages.size() = " + mImages.size());

            return null;

        }
}

分段

    private ArrayList<Image> mImages = new ArrayList<>();
    private ImagesAdapter mImagesAdapter = new ImagesAdapter(mImages);
    private static final String TAG = "UploadNewsFragment";

    private Object[] mdata = new Object[2];
/**
<...>
*/
  private class loadImageTask extends AsyncTask<Object, Void, Bitmap> {

    Bitmap image = null;
    Uri uri, uriSource;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

    }
protected Bitmap doInBackground(Object... obj) {
            uri = (Uri) obj[1];
            uriSource = (Uri) obj[0];
            try {
                // Use the MediaStore to load the image.
                image = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), uri);

            } catch (IOException e) {
                e.printStackTrace();
                Log.e(TAG, "Error: " + e.getMessage() + "Could not open URI: "
                        + uri.toString());
            }

            return null;
        }


        protected void onPostExecute(Bitmap resultimage) {

            mImages.add(new Image(uriSource, image)); //here adds to the list
            mImagesAdapter.notifyDataSetChanged();
            mRecyclerView.smoothScrollToPosition(mImagesAdapter.getItemCount() - 1);

            Log.d(TAG, "OnPostExecute mImages.size() =" + mImages.size());// the mImages.s1ze() returns the correct value

        }}

主要活動

    private ArrayList<Uri> newsImagesuri = new ArrayList<>();
        private ArrayList<String> uris = new ArrayList<>();
        String uriTostring;
        CW update;

        private ArrayList<Image> newsImages = new ArrayList<>();
        private ImagesAdapter mImagesAdapter = new ImagesAdapter(newsImages);

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mCompressor = new FileCompressor(this);


        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = findViewById(R.id.fab);

        // Called here..
        fab.setOnClickListener(view -> 
                upload_crime(view)
        );
        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        NavigationView navigationView = findViewById(R.id.nav_view);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();
        navigationView.setNavigationItemSelectedListener(this);

        //add this line to display menu1 when the activity is loaded
        displaySelectedScreen(R.id.nav_home);


        cwViewModel = ViewModelProviders.of(this)
                .get(CWViewModel.class);


    }
    /**
       <...>
    */

    public void upload_crime(View view) {
            EditText update_news = findViewById(R.id.update_news);
            String contents = update_news.getText().toString();
            Date now = Calendar.getInstance().getTime();

            newsImagesuri = mImagesAdapter.getImageUris(); // Here returns null from adapter
            if (newsImagesuri != null) {
                Log.d(TAG, "newsImagesuri != null" + newsImagesuri);
                for (Uri uri : newsImagesuri) {
                    uriTostring = uri.toString();
                    uris.add(uriTostring);
                    Log.d(TAG, "converted uris" + uris);
                }

                update = new CW(now, contents, uris);
                Log.d(TAG, "update contain uri" + uris);
            } else {

                Log.d(TAG, "newsImagesuri = null");

                update = new CW(now, contents, null);
            }

堆棧跟蹤

D/ImagesAdapter: imagesAdapter getItemCount = 0
    imagesAdapter getItemCount = 0
D/ViewRootImpl: ViewPostImeInputStage processPointer 0
D/ViewRootImpl: ViewPostImeInputStage processPointer 1
D/ImagesAdapter: getImagesUris = Null 
     mImages.size() = 0
D/MainActivity: newsImagesuri = null
D/TextView: setTypeface with style : 0
D/ViewRootImpl: ViewPostImeInputStage processPointer 0
D/ViewRootImpl: ViewPostImeInputStage processPointer 1
D/ViewRootImpl: ViewPostImeInputStage processPointer 0
D/ViewRootImpl: ViewPostImeInputStage processPointer 1

show : false
I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@27bdf29 time:17894100
D/ImagesAdapter: imagesAdapter getItemCount = 1
D/UploadNewsFragment: OnPostExecute mImages.size() =1
D/ImagesAdapter: imagesAdapter getItemCount = 1
    imagesAdapter getItemCount = 1
    imagesAdapter getItemCount = 1
I/BitmapFactory: DecodeImagePath(decodeResourceStream3) : value is null. res : null
D/ImagesAdapter: imagesAdapter bind successful
    imagesAdapter getItemCount = 1
    imagesAdapter getItemCount = 1
    imagesAdapter getItemCount = 1
D/ViewRootImpl: ViewPostImeInputStage processPointer 0
D/ViewRootImpl: ViewPostImeInputStage processPointer 1
D/ImagesAdapter: getImagesUris = Null 
     mImages.size() = 0
D/MainActivity: newsImagesuri = null
D/TextView: setTypeface with style : 0
D/ViewRootImpl: ViewPostImeInputStage processPointer 0
D/ViewRootImpl: ViewPostImeInputStage processPointer 1
V/ActivityThread: updateVisibility : ActivityRecord{8f2490 token=android.os.BinderProxy@27bdf29 {com.x.unncrimewatch/com.x.unncrimewatch.MainActivity}} show : true
V/ActivityThread: updateVisibility : ActivityRecord{8f2490 token=android.os.BinderProxy@27bdf29 {com.x.unncrimewatch/com.x.unncrimewatch.MainActivity}} show : false

我想我知道為什么。 您在MainActivityFragment有2個單獨的適配器,並帶有2個不同的圖像列表。

您將項目添加到Fragment中的列表中,但MainActivity中的列表從未更新。

因此,當您在MainActivity中調用upload_crime()時,圖片列表的大小始終為0。

您只應在一個位置與適配器交互,最好是片段

要將信息從Array傳遞到其他Array時,您做錯了。 不能執行此操作-> mImages = images;

您可能會問為什么?...當您這樣做時, mImages等於images ,換句話說,如果您清除圖像images.clear。mImages也將被清除。

您需要做的mImages.addAll(images); 這樣,兩者都將具有相同的data但兩者將有所不同,換句話說,如果您清除其中一個數組,則另一個不會被清除。

確保在您執行array = array每個地方都執行我告訴您的內容。

希望它幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM