我正在寻找答案半天,但我找不到任何东西,虽然我认为这是一个常见的问题.我的问题:
我有一个ListView,它有不同大小(高度)的项目.每个项目都包含一个 ImageView.此 ImageView的图像由ImageLoader类在后台加载:
imageLoader.displayImage(url,holder.image);

如果我向下滚动ListView一切正常.图像被加载并显示(当然在屏幕/列表的底部).

但是如果我向上滚动并且图像不再存储在缓存中,那么ImageLoader必须重新加载图像,ListView跳转/项目被移动.我认为这是因为在列表顶部创建了一个新的View,其ImageView的高度为0dp.如果图像已加载并设置为ImageView,则ImageView的高度会自动从0dp更改为图像的大小.我认为这会推动ListView.

如果设置了图像,我尝试保存ImageViews的高度,然后将在顶部创建的ImageView的高度设置为保存的高度.但没有成功..

我不知道你是否能理解我的问题:D我希望如此:)

感谢,并有一个愉快的一天!

编辑:添加了ImageLoader类

public class ImageLoader {

MemoryCache memoryCache=new MemoryCache();
FileCache fileCache;
int size;
Context context;
private Map<ImageView,String> imageViews=Collections.synchronizedMap(new WeakHashMap<ImageView,String>());
private HashMap<String,Integer> imagesSizes; 
ExecutorService executorService;
Handler handler=new Handler();//handler to display images in UI thread

public ImageLoader(Context context,int size){
    fileCache=new FileCache(context);
    this.context = context;
    executorService=Executors.newFixedThreadPool(5);
    this.size = size;
    imagesSizes = new HashMap<String,Integer>();
}

final int stub_id=R.color.transparent;
public void displayImage(String url,ImageView imageView)
{
    imageViews.put(imageView,url);
    Bitmap bitmap=memoryCache.get(url);
    if(bitmap!=null){
        imageView.setimageBitmap(bitmap);
        saveImageSize(imageView,url);
    }   
    else
    {
        queuePhoto(url,imageView);
        imageView.setimageResource(stub_id);
        setimageSize(imageView,url);
    }
}

public void displayImage(File file,file.getAbsolutePath());
    Bitmap bitmap=memoryCache.get(file.getAbsolutePath());
    if(bitmap!=null){
        imageView.setimageBitmap(bitmap);
        saveImageSize(imageView,file.getAbsolutePath());
    } 
    else
    {
        queuePhoto(file,file.getAbsolutePath());
    }
}

private void saveImageSize(ImageView imageView,String url){

    int height = imageView.getHeight();
    imagesSizes.put(url,height);
    System.out.println("IMAGE SIZE: Save: " + url + "  " + height );
}

private void setimageSize(ImageView imageView,String url){
    if(imageView != null && imagesSizes!=null && imagesSizes.containsKey(url)){
        imageView.getLayoutParams().height = imagesSizes.get(url);
        imageView.requestLayout();
        System.out.println("IMAGE SIZE: Set: " + url + "  " + imagesSizes.get(url) );
    }
}


private void queuePhoto(String url,ImageView imageView)
{
    PhotoToLoad p=new PhotoToLoad(url,imageView);
    executorService.submit(new Photosloader(p));
}

private void queuePhoto(File file,ImageView imageView)
{
    PhotoToLoad p=new PhotoToLoad(file,imageView);
    executorService.submit(new Photosloader(p));
}

public Bitmap getimage(String url){
    return getBitmap(url);
}

private Bitmap getBitmap(String url) 
{
    File f=fileCache.getFile(url);

    //from SD cache
    Bitmap b = decodeFile(f);
    if(b!=null)
        return b;

    //from web
    try {
        Bitmap bitmap=null;
        URL imageUrl = new URL(url);
        HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
        conn.setConnectTimeout(30000);
        conn.setReadTimeout(30000);
        conn.setInstanceFollowRedirects(true);
        InputStream is=conn.getInputStream();
        OutputStream os = new FileOutputStream(f);
        Utils.copyStream(is,os);
        os.close();
        conn.disconnect();
        bitmap = decodeFile(f);
        return bitmap;
    } catch (Throwable ex){
       ex.printstacktrace();
       if(ex instanceof OutOfMemoryError)
           memoryCache.clear();
       return null;
    }
}

//decodes image and scales it to reduce memory consumption
private Bitmap decodeFile(File f){
    try {
        //decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        FileInputStream stream1=new FileInputStream(f);
        BitmapFactory.decodeStream(stream1,null,o);
        stream1.close();

        //Find the correct scale value. It should be the power of 2.
        final int required_SIZE=size;
        int width_tmp=o.outWidth,height_tmp=o.outHeight;
        int scale=1;
        while(true){
            if(width_tmp/2<required_SIZE || height_tmp/2<required_SIZE)
                break;
            width_tmp/=2;
            height_tmp/=2;
            scale*=2;
        }

        //decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize=scale;
        FileInputStream stream2=new FileInputStream(f);
        Bitmap bitmap=BitmapFactory.decodeStream(stream2,o2);
        stream2.close();
        return bitmap;
    } catch (FileNotFoundException e) {
    } 
    catch (IOException e) {
        e.printstacktrace();
    }
    return null;
}

//Task for the queue
private class PhotoToLoad
{
    public File file;
    public String url;
    public ImageView imageView;
    public PhotoToLoad(String u,ImageView i){
        url=u; 
        imageView=i;
        file = null;
    }

    public PhotoToLoad(File file,ImageView i){
        url=file.getAbsolutePath(); 
        imageView=i;
        this.file = file;
    }
}

class Photosloader implements Runnable {
    PhotoToLoad photoToLoad;
    Photosloader(PhotoToLoad photoToLoad){
        this.photoToLoad=photoToLoad;
    }

    @Override
    public void run() {
        try{
            if(imageViewReused(photoToLoad))
                return;
            Bitmap bmp;
            if(photoToLoad.file== null){
                bmp=getBitmap(photoToLoad.url);
            } else {
                bmp=decodeFile(photoToLoad.file);
            }
            memoryCache.put(photoToLoad.url,bmp);
            if(imageViewReused(photoToLoad))
                return;
            Bitmapdisplayer bd=new Bitmapdisplayer(bmp,photoToLoad);
            handler.post(bd);
        }catch(Throwable th){
            th.printstacktrace();
        }
    }
}

boolean imageViewReused(PhotoToLoad photoToLoad){
    String tag=imageViews.get(photoToLoad.imageView);
    if(tag==null || !tag.equals(photoToLoad.url))
        return true;
    return false;
}

//Used to display bitmap in the UI thread
class Bitmapdisplayer implements Runnable
{
    Bitmap bitmap;
    PhotoToLoad photoToLoad;
    public Bitmapdisplayer(Bitmap b,PhotoToLoad p){bitmap=b;photoToLoad=p;}
    public void run()
    {
        if(imageViewReused(photoToLoad))
            return;
        if(bitmap!=null)
            photoToLoad.imageView.setimageBitmap(bitmap);
        else
            photoToLoad.imageView.setimageResource(stub_id);
        if(photoToLoad.file== null){
            setimageSize(photoToLoad.imageView,photoToLoad.url);
        } else {
            setimageSize(photoToLoad.imageView,photoToLoad.file.getAbsolutePath());
        }

    }
}



public void clearCache() {
    memoryCache.clear();
    fileCache.clear();
}

编辑:添加适配器:

public class LazyNewPostsAdapter extends BaseAdapter implements Constants{

private Activity activity;
private ArrayList<Image> data;
private static LayoutInflater inflater=null;
private ImageLoader imageLoader; 
private AsyncHelper helper;
public static final int VIEW_TYPE_LOADING = 0;
public static final int VIEW_TYPE_ACTIVITY = 1;

private int imgposition;
Handler fmHandler = null;

Handler handler = new Handler(){
    public void handleMessage(android.os.Message msg) {
        switch(msg.what){
        case HANDLER_NEW_POST_Vote_IMAGE:
                int position = msg.arg1;
            JSONObject json;
            try {
                json = new JSONObject((String) msg.obj);

                int success =  json.getInt("success");

                if(success == 1){

                    int i_id = json.getInt("i_id");
                    int VotesUp = json.getInt("Votes_up");
                    int VotesDown = json.getInt("Votes_down");

                    data.get(position).setVotesUp(VotesUp);
                    data.get(position).setVotesDown(VotesDown);
                    notifyDataSetChanged();
                }

            } catch (JSONException e) {
                e.printstacktrace();
            }   

            break;
        case HANDLER_USER_REPORTED_IMAGE:
            JSONObject json2 = Utils.createJSON((String)msg.obj);
            System.out.println("REPORT IMAGE " + json2);
            if(json2 != null){
                try {
                    int success = json2.getInt("success");
                    if(success==1){
                         Toast.makeText(activity,"Image reported!",Toast.LENGTH_LONG).show();

                    }
                } catch (JSONException e) {
                    // Todo Auto-generated catch block
                    e.printstacktrace();
                }
            }
            break;
        case HANDLER_IMAGE_SIZE_AVAILABLE:
            String url = (String) msg.obj;
            int height = msg.arg1;
            int width = msg.arg2;

            int imgPosition = findImageOfCertainURL(url);
            System.out.println("GETVIEW HANDLER 1: IMAGE POSITION" + imgPosition);

            if(imgPosition != -1){
                data.get(imgPosition).setHeight(height);
                data.get(imgPosition).setWidth(width);
            }
            Message copyMsg = new Message();
            copyMsg.what = HANDLER_IMAGE_SIZE_AVAILABLE;
            copyMsg.arg1 = height;
            copyMsg.arg2 = width;
            copyMsg.obj = url;
            fmHandler.sendMessage(copyMsg);
            notifyDataSetChanged();
            break;
        }
    };
};

private int findImageOfCertainURL(String url){
    for(int i = 0; i <data.size();i++){
        if((URL_FOLDER_IMAGES + data.get(i).getUrl()).equalsIgnoreCase(url)){
            return i;
        }
    }
    return -1;
}

public LazyNewPostsAdapter(Activity a,ArrayList<Image> d,Handler fragmentHandler) {

    activity = a;

    data=d;
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    helper =  new AsyncHelper(activity,handler);

    imageLoader=new ImageLoader(activity.getApplicationContext(),600,handler) ;
    fmHandler = fragmentHandler;
}

public void updateData(ArrayList<Image> d){
    data = d;
    notifyDataSetChanged();
}



public int getCount() {
    return data.size()+1;
}

@Override
public int getViewTypeCount() {
    return 2;
}

@Override
public int getItemViewType(int position) {
    // Todo Auto-generated method stub
    return (position >= data.size()) ? VIEW_TYPE_LOADING
            : VIEW_TYPE_ACTIVITY;
}

@Override
public boolean isEnabled(int position) {
    return getItemViewType(position) == VIEW_TYPE_ACTIVITY;
}

public Object getItem(int position) {
    return (getItemViewType(position) == VIEW_TYPE_ACTIVITY) ? data.get(position) : null;
}

public long getItemId(int position) {
    return (getItemViewType(position) == VIEW_TYPE_ACTIVITY) ? position
            : -1;
}

public View getFooterView(int position,View convertView,ViewGroup parent) {

        // the ListView has reached the last row
        TextView tvLastRow = new TextView(activity);
        if(AsyncHelper.isDownloadingImages){
            tvLastRow.setHint("Requesting new Images..");
        } else {

            tvLastRow.setHint("Reached the last row.");
        }
        tvLastRow.setGravity(Gravity.CENTER);
        return tvLastRow;

}

private OnClickListener myHotButtonClickListener = new OnClickListener() {
    @Override
    public void onClick(View v) {
        int position = (Integer) v.getTag();
        if(ActivityMain.user.isLoggedIn()){
            data.get(position).setThisUserVote(1);
            helper.Vote_image(position,data.get(position).getId(),HOT);
        } else {
            Toast.makeText(activity,"Login to Vote",Toast.LENGTH_SHORT).show();
        }
    }
};

private OnClickListener myColdButtonClickListener = new OnClickListener() {
    @Override
    public void onClick(View v) {
        int position = (Integer) v.getTag();
        if(ActivityMain.user.isLoggedIn()){
            data.get(position).setThisUserVote(2);
            helper.Vote_image(position,COLD);
        }else {
            Toast.makeText(activity,Toast.LENGTH_SHORT).show();
        }
    }
};

private OnClickListener myOptionsButtonClickListener = new OnClickListener() {
    @Override
    public void onClick(View v) {
        final int position = (Integer) v.getTag();
        Runnable optionsRunnable = new Runnable() {

            @Override
            public void run() {


                openoptionsDialog(position);

            }
        };
        handler.postDelayed(optionsRunnable,500);


    }
};
private void openoptionsDialog(final int imgposition){
    final CharSequence[] items = {"Share","Save","Report"};

    AlertDialog.Builder builder = new AlertDialog.Builder(activity);
    builder.setTitle("Options");
    builder.setItems(items,new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog,int item) {
            if(item==0){
                Utils.shareImage(activity,imageLoader.getimage(URL_FOLDER_IMAGES + data.get(imgposition).getUrl()),data.get(imgposition).getTitle());
            } else if(item==1) {
                Utils.saveImage(imageLoader.getimage(URL_FOLDER_IMAGES + data.get(imgposition).getUrl()),activity);
            } else if(item==2) {
                openReportDialog(imgposition);
            }
        }
    });
    AlertDialog alert = builder.create();
    alert.show();
}

private void openReportDialog(final int imgposition){

    AlertDialog.Builder builder = new AlertDialog.Builder(activity,R.style.AppCompatAlertDialogStyle);
    builder.setTitle("Report This Image?");
    builder.setPositiveButton("Yes",new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog,int which) {
            helper.reportimage(data.get(imgposition).getId());
        }
    });
    builder.setNegativeButton("No",null);

    AlertDialog alert = builder.create();
    alert.show();
}

public View getView(final int position,ViewGroup parent) {
    if (getItemViewType(position) == VIEW_TYPE_LOADING) {
        // display the last row
        return getFooterView(position,convertView,parent);
    }
    View vi=convertView;
    final ViewHolder holder;
    final Image img = data.get(position);
    boolean isViNull = false;
    if(convertView==null){
    vi = inflater.inflate(R.layout.item_new_posts,null);
        holder = new ViewHolder();
        isViNull = true;
        holder.title=(BrushTextView)vi.findViewById(R.id.tv_newposts_title);
        holder.image=(RatioImageView)vi.findViewById(R.id.iv_newposts_image);
        holder.uploader = (BrushTextView) vi.findViewById(R.id.tv_newposts_uploader);
        holder.upVotes = (BrushTextView) vi.findViewById(R.id.tv_newposts_upVotes);
        holder.downVotes= (BrushTextView) vi.findViewById(R.id.tv_newposts_downVotes);
        holder.options=(LinearLayout)vi.findViewById(R.id.ll_newposts_button_options);

        holder.iv_hot=(ImageView)vi.findViewById(R.id.iv_newposts_button_upVote);
        holder.iv_cold=(ImageView)vi.findViewById(R.id.iv_newposts_button_downVote);
        holder.ll_hot=(LinearLayout)vi.findViewById(R.id.ll_newposts_button_upVote);
        holder.ll_cold=(LinearLayout)vi.findViewById(R.id.ll_newposts_button_downVote);

        vi.setTag(holder);

    } else {
        holder = (ViewHolder) vi.getTag();
    }


    if(img.getHeight() != 0 && img.getWidth() != 0){

        holder.image.getLayoutParams().height = img.getHeight();
        holder.image.getLayoutParams().width = img.getWidth();
        holder.image.requestLayout();
    }
    holder.ll_hot.setTag(position);
    holder.ll_hot.setonClickListener(myHotButtonClickListener);
    holder.ll_cold.setTag(position);
    holder.ll_cold.setonClickListener(myColdButtonClickListener);


    holder.options.setTag(position);
    holder.options.setonClickListener(myOptionsButtonClickListener);


    changeVoteButtonImages(img,holder.iv_hot,holder.iv_cold);
    if(img.getTitle()!=null){
        holder.title.setVisibility(View.VISIBLE);
        holder.title.setText(img.getTitle());
    } else {
        holder.title.setVisibility(View.GONE);
    }
    holder.uploader.setText(img.getUploader());
    holder.upVotes.setText(img.getVotesUp()+"");
    holder.downVotes.setText(img.getVotesDown()+"");
    String url = URL_FOLDER_IMAGES + img.getUrl();
    System.out.println("GETVIEW NEW POST ADAPTER: height = " + img.getHeight() + "  width = " + img.getWidth());
    if(isViNull)
    System.out.println("GETVIEW CONVERTVIEW: VI: "  +vi.getHeight());
    imageLoader.displayImage(url,holder.image);

    return vi;
}

private void changeVoteButtonImages(Image image,ImageView upVote,ImageView  downVote){
    switch(image.getThisUserVote()){
    case 0:
        upVote.setimageDrawable(activity.getResources().getDrawable(R.drawable.ic_post_hot_0));
        downVote.setimageDrawable(activity.getResources().getDrawable(R.drawable.ic_post_cold_0));
        break;
    case 1:
        downVote.setimageDrawable(activity.getResources().getDrawable(R.drawable.ic_post_cold_0));
        upVote.setimageDrawable(activity.getResources().getDrawable(R.drawable.ic_post_hot_1));
        break;
    case 2:
        upVote.setimageDrawable(activity.getResources().getDrawable(R.drawable.ic_post_hot_0));
        downVote.setimageDrawable(activity.getResources().getDrawable(R.drawable.ic_post_cold_1));
        break;
    }
}

static class ViewHolder {            
   public BrushTextView title,uploader,upVotes,downVotes;
   public ImageView iv_hot,iv_cold;
   public LinearLayout options,ll_hot,ll_cold;
   public RatioImageView image; 
}

}

这里是Fragment,它包含ListView

public class Fragment_New_Posts extends Fragment implements Constants,OnRefreshListener{

private static final String ARG_SECTION_NUMBER = "section_number";

private ListView list;
private LazyNewPostsAdapter adapter;
private Images images;
private ArrayList<Image> imagesList;
private SharedPreferences prefs;
private Editor editor;
private int visible_i_id;
private SwipeRefreshLayout swipeLayout;
private int option_image_filter;
private AsyncHelper helper;
private boolean onRefreshFired = false;
private Parcelable state;

public static Fragment_New_Posts newInstance(int sectionNumber) {
    Fragment_New_Posts fragment = new Fragment_New_Posts();
    Bundle args = new Bundle();
    args.putInt(ARG_SECTION_NUMBER,sectionNumber);
    fragment.setArguments(args);
    return fragment;
}

public static Fragment_New_Posts newInstance(int sectionNumber,Images imgs) {
    Fragment_New_Posts fragment = new Fragment_New_Posts(imgs);
    Bundle args = new Bundle();
    args.putInt(ARG_SECTION_NUMBER,sectionNumber);
    fragment.setArguments(args);
    return fragment;
}

public void updateImages(Images images,boolean createNew,boolean loadOldImages){
    int i_id_position = 0;
    this.images = images;
    if(!images.hasErrorOccured){
        if(this.imagesList == null || createNew || onRefreshFired){
            this.imagesList = images.getlistofImages();
        } else {
            this.imagesList.addAll(images.getlistofImages());
        }
    } 

    if(loadOldImages){
        i_id_position = this.images.getIDPosition(visible_i_id);
    }
    if(onRefreshFired){
        swipeLayout.setRefreshing(false);
        onRefreshFired = false;
    }
    synchronized (adapter) {
        adapter.updateData(this.imagesList);
        if(list!=null && createNew){
            if(loadOldImages){
                list.setSelection(i_id_position);
            } else {
                list.setSelection(0);
            }
        }
    }

}

private Handler handler = new Handler(){
    public void handleMessage(android.os.Message msg) {
        switch(msg.what){
        case HANDLER_MAIN_IMAGE_UPDATE:
            String imagesstring =  (String) msg.obj;
            Images imgs = new Images(imagesstring);
            updateImages(imgs,false,false);
            if(imgs.hasErrorOccured){
                Toast.makeText(getActivity(),"Can\'t get new Images",Toast.LENGTH_SHORT).show();
            }
            break;
        case HANDLER_IMAGE_SIZE_AVAILABLE:
            String url = (String) msg.obj;
            int height = msg.arg1;
            int width = msg.arg2;

            int imgPosition = findImageOfCertainURL(url);
            System.out.println("GETVIEW HANDLER 2: IMAGE POSITION" + imgPosition);
            if(imgPosition != -1){
                imagesList.get(imgPosition).setHeight(height);
                imagesList.get(imgPosition).setWidth(width);
            }

            break;
        }

    };
};

private int findImageOfCertainURL(String url){
    for(int i = 0; i <imagesList.size();i++){
        if((URL_FOLDER_IMAGES + imagesList.get(i).getUrl()).equalsIgnoreCase(url)){
            return i;
        }
    }
    return -1;
}

public Fragment_New_Posts() {
}

public Fragment_New_Posts(Images imgs) {
    this.images = imgs;
}

@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
    System.out.println("NEW POST FRAGMENT ONCREATE");
    View rootView = inflater.inflate(R.layout.fragment_new_posts,container,false);
    prefs = getActivity().getSharedPreferences(PREF_WOODU,getActivity().MODE_PRIVATE);
    editor = prefs.edit();
    if(prefs!=null){
        visible_i_id = prefs.getInt(PREF_NEW_POSTS_VISIBLE_I_ID,0);
        option_image_filter = prefs.getInt(PHP_TAG_IMAGE_FILTER,0);
    }
    swipeLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.swipe_container);
    swipeLayout.setColorSchemeColors(R.color.red_hot);
    swipeLayout.setonRefreshListener(this);
    helper = new AsyncHelper(getActivity(),handler);
    imagesList = new ArrayList<Image>();
    if(images != null){
        imagesList = images.getlistofImages();
        System.out.println("SAVE IMAGES: load: imgsList " + imagesList);

    }
    list = (ListView) rootView.findViewById(R.id.lv_new_posts);
    adapter = new LazyNewPostsAdapter(getActivity(),imagesList,handler);
    list.setAdapter(adapter);

    list.setonScrollListener(new endlessscrollListener() {
        @Override
        public void onLoadMore(int page,int totalItemsCount) {
            if(imagesList!=null && imagesList.size()!=0){
                helper.getimageUpdate(imagesList.get(imagesList.size()-1).getId(),option_image_filter);
            }
        }
    });

    if(images != null){
        updateImages(images,true,true);
    }

    return rootView;
}



@Override
public void onPause() {
    int lastVisposition = list.getLastVisiblePosition();
    if(lastVisposition>=0 && lastVisposition < this.imagesList.size()){
        visible_i_id = this.imagesList.get(list.getFirstVisiblePosition()).getId();
        editor.putInt(PREF_NEW_POSTS_VISIBLE_I_ID,visible_i_id);
        editor.commit();
    }

    super.onPause();
}




@Override
public void onResume() {
    super.onResume();


}

@Override
public void onDestroy() {
    if(images != null){
        editor.putString(PREF_NEW_POSTS_CURRENT_IMAGES,Utils.createJSONStringFromImageArrayList(imagesList,editor));
        editor.commit();
    }
    super.onDestroy();
}

@Override
public void onRefresh() {
    onRefreshFired = true;
    if(prefs!=null){
        option_image_filter = prefs.getInt(PHP_TAG_IMAGE_FILTER,0);
    }
    helper.getimageUpdate(0,option_image_filter);
}
}

现在这里有很多信息和代码.我希望这不会吓到任何人提供帮助:D

谢谢!!

解决方法

请,请,请不要“重新发明轮子”并使用任何lib来进行图像加载,缓存等,如Picasso,Fresco,Glide等….

android – ListView – ImageLoader在向上滚动时移动列表/项目的更多相关文章

  1. ios – 在React Native中设置ListView的高度

    我需要设置ListView的宽度和高度.当设置宽度按预期工作时,设置高度无效,ListView总是伸展到屏幕的几乎底部.我用这种方式在render方法中创建ListView:这是它的风格:我还尝试通过此命令在方法中设置其高度:当我尝试使用此命令设置宽度时,它可以工作.但设定高度什么都不做.如何将ListView的高度设置为所需的值?

  2. 将设备升级到iOS12后应用程序崩溃

    我的企业应用程序工作正常,直到iOS11.昨天,我将其中一个设备更新到iOS12并测试了该应用程序.它在发布时崩溃了.调试时我发现它在Simulator上工作正常,但在调用main之前就崩溃了.崩溃日志已经通过Apple开发者论坛和其他堆栈溢出崩溃.但到目前为止还没有指针.任何帮助或指示表示赞赏.解决方法我的应用程序崩溃了旧版的CrittercismiOSSDK.

  3. 企业(内部)Swift应用程序在iOS9上推出后退出

    我们发现我们的内部证书签署的Swift应用程序无法在iOS9上运行,而在iOS8上正常运行.我们已经信任开发人员的设置–>一般–>配置文件,但是当我们尝试启动应用程序时,它会卡在启动屏幕上,然后退出.我们从日志中没有任何线索.它只告诉它在20时之后没能启动.我怀疑这是一个与签约有关的问题.因为当我使用AdHoc证书签署应用程序时,在iOS9上运行没有问题.没有人知道发生了什么吗?

  4. Android ListView中的弹出菜单问题

    )方法并把方法在您的适配器类中.注意:act是在创建构造函数适配器时必须绑定的Activity,例如:在Activity中,您可以编写代码:

  5. android – 在listview中添加viewpager作为滚动标题

    我试图在列表标题中添加Viewpager(使用支持库4),但它没有显示任何内容.这是我的代码请帮忙.它将在列表标题中不作为项目,因此它不应该是一个问题.解决方法listadapter之后的listview页眉和页脚显示.如果你尝试setadapter,并且看不到viewpager.检查viewpager的宽度和高度.如果viewpager的宽度或高度值为0.在viewgroup中创建LienarL

  6. android – Listview滚动错误5.1

    刚注意到ListView中一个非常奇怪的错误,似乎只能重现5.1,我真的很想知道没有人提起它.很容易重现:查找具有足够项目的ListView,滚动到列表的3/4,现在快速向上滚动,您会注意到ListView滚动一直到底部!现在IMO这是一个非常严重的错误,我想尽快找到解决方法/修复,所以任何人都有一个?更新:ListView.java没有从SDK21更改,但AbsListView.java没有.解决方法您可以使用回收站视图而不是列表视图,因为Google可能不再支持它.试试YouTube上的幻灯片视频.它

  7. android – 在ListView中禁用项目焦点

    当我点击它时,如何从ListView中的Item禁用焦点,以便没有关注点击?解决方法以下是禁用ListView焦点的答案.在适配器中覆盖isEnabled方法并返回false.

  8. Android – 从ListView中删除项目时的动画

    我在一个活动中有一个ListView.在每个列表项中都有一个文本和一个CheckBox.单击CheckBox,我想从ListView中删除该项目,并希望添加一个动画,如向下滑动或淡出,然后删除.有帮助吗?

  9. android – 如何在ListView中正确使用TextSwitcher?

    ),然后播放动画.text2到text1的更改正确发生.我的理解原因如下–在显示text2之前,itemTime的所有视图都被删除,因此它被重新创建,这就是为什么一些其他值被显示为秒的原因.但为什么它显示其他记录的价值呢?

  10. android – 带复选框的ListView项目 – 如何删除复选框涟漪效应?

    我有一个带有项目的ListView包含一个复选框和一些其他元素.问题是,当我点击Android5设备上的列表项时,我看起来像这样:我不希望在复选框周围产生涟漪效应.我怎么能实现这一点?

随机推荐

  1. bluetooth-lowenergy – Altbeacon库无法在Android 5.0上运行

    昨天我在Nexus4上获得了Android5.0的更新,并且altbeacon库停止了检测信标.似乎在监视和测距时,didEnterRegion和didRangeBeaconsInRegion都没有被调用.即使RadiusNetworks的Locate应用程序现在表现不同,一旦检测到信标的值,它们就不再得到更新,并且通常看起来好像信标超出了范围.我注意到的一点是,现在在logcat中出现以下行“B

  2. android – react-native动态更改响应者

    我正在使用react-native进行Android开发.我有一个视图,如果用户长按,我想显示一个可以拖动的动画视图.我可以使用PanResponder实现这一点,它工作正常.但我想要做的是当用户长按时,用户应该能够继续相同的触摸/按下并拖动新显示的Animated.View.如果您熟悉Google云端硬盘应用,则它具有类似的功能.当用户长按列表中的任何项目时,它会显示可拖动的项目.用户可以直接拖

  3. android – 是否有可能通过使用与最初使用的证书不同的证书对其进行签名来发布更新的应用程序

    是否可以通过使用与最初使用的证书不同的证书进行签名来发布Android应用程序的更新?我知道当我们尝试将这样的构建上传到市场时,它通常会给出错误消息.但有没有任何出路,比如将其标记为主要版本,指定市场中的某个地方?解决方法不,你不能这样做.证书是一种工具,可确保您是首次上传应用程序的人.所以总是备份密钥库!

  4. 如何检测Android中是否存在麦克风?

    ..所以我想在让用户访问语音输入功能之前检测麦克风是否存在.如何检测设备上是否有麦克风.谢谢.解决方法AndroidAPI参考:hasSystemFeature

  5. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

  6. android – 获得一首歌的流派

    我如何阅读与歌曲相关的流派?我可以读这首歌,但是如何抓住这首歌的流派,它存放在哪里?解决方法检查此代码:

  7. android – 使用textShadow折叠工具栏

    我有一个折叠工具栏的问题,在展开状态我想在文本下面有一个模糊的阴影,我使用这段代码:用:我可以更改textColor,它可以工作,但阴影不起作用.我为阴影尝试了很多不同的值.是否可以为折叠文本投射阴影?

  8. android – 重用arm共享库

    我已经建立了armarm共享库.我有兴趣重用一个函数.我想调用该函数并获得返回值.有可能做这样的事吗?我没有任何头文件.我试过这个Android.mk,我把libtest.so放在/jni和/libs/armeabi,/lib/armeabi中.此时我的cpp文件编译,但现在是什么?我从objdump知道它的名字编辑:我试图用这个android.mk从hello-jni示例中添加prebuild库:它工作,但libtest.so相同的代码显示以下错误(启动时)libtest.so存在于libhello-j

  9. android – 为NumberPicker捕获键盘’Done’

    我有一个AlertDialog只有一些文本,一个NumberPicker,一个OK和一个取消.(我知道,这个对话框还没有做它应该保留暂停和恢复状态的事情.)我想在软键盘或其他IME上执行“完成”操作来关闭对话框,就像按下了“OK”一样,因为只有一个小部件可以编辑.看起来处理IME“Done”的最佳方法通常是在TextView上使用setonEditorActionListener.但我没有任何Te

  10. android – 想要在调用WebChromeClient#onCreateWindow时知道目标URL

    当我点击一个带有target=“_blank”属性的超链接时,会调用WebChromeClient#onCreateWindow,但我找不到新的窗口将打开的新方法?主页url是我唯一能知道的东西?我想根据目标网址更改应用行为.任何帮助表示赞赏,谢谢!

返回
顶部