【问题标题】:Cannot show images from parse.com in listview无法在列表视图中显示来自 parse.com 的图像
【发布时间】:2015-08-29 13:21:37
【问题描述】:

我正在尝试检索我保存在 Parse.com 上的图像。没有错误,但图像未显示。我正在使用自定义适配器。

这是活动。我尝试运行调试器,但在那里找不到任何问题。

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

    mProgress = (ProgressBar)findViewById(R.id.progressBar2);
    lv = (ListView)findViewById(R.id.listView);
    fileArrayList =  new ArrayList<ParseFile>();

    mProgress.setVisibility(View.VISIBLE);


    ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("Images");
    query.findInBackground(new FindCallback<ParseObject>() {
        @Override
        public void done(List<ParseObject> list, ParseException e) {
            if (e == null) {
                mProgress.setVisibility(View.INVISIBLE);
                for (ParseObject obj : list) {
                    ParseFile i = obj.getParseFile("Image");
                    fileArrayList.add(i);
                }
            } else {
                Toast.makeText(getApplicationContext(), "Error retrieving images: " + e.getMessage(), Toast.LENGTH_SHORT).show();

            }
        }
    });

    listviewAdapter = new ListviewAdapter(ImageActivty.this, fileArrayList);
    lv.setAdapter(listviewAdapter);


}

这是我的适配器。

public class ListviewAdapter extends BaseAdapter{

private final static String TAG = ListviewAdapter.class.getSimpleName();

private Context activity;
private LayoutInflater inflater = null;
private List<ParseFile> sellers;
int layout;

public ListviewAdapter(Context activity, List<ParseFile> sellers) {

    this.activity = activity;
    this.sellers = sellers;
    inflater = LayoutInflater.from(activity);
}

@Override
public int getCount() {
    return 0;
}

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

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

public  class ViewHolder {
    ImageView imageView;
    FrameLayout rl;
    TextView textView;
}

@Override
public View getView(int position, View view, ViewGroup parent) {
    View v =view;
    ViewHolder holder = new ViewHolder();

    if (view == null) {
        LayoutInflater li = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = li.inflate(R.layout.list_item,null);
        holder.imageView = (ImageView)view.findViewById(R.id.imageView2);
        v.setTag(holder);
    } else {
        holder = (ViewHolder) v.getTag();
    }


    ParseFile s = sellers.get(position);
    byte[] bitmapdata = new byte[0];
    try {
        bitmapdata = s.getData();
    } catch (ParseException e) {
        e.printStackTrace();
        Log.d("ListAdapter","Error here.");
    }
    Bitmap bitmap = BitmapFactory.decodeByteArray(bitmapdata , 0, bitmapdata.length);

    holder.imageView.setImageBitmap(bitmap);
    Log.d("CustomAdapter.class", "CustomAdapter");
    return v;
 }
}

我的一个朋友帮助我将解析文件转换为适配器中的位图。我怀疑实施是错误的。如果是,我如何将 ParseFile 转换为位图。有没有其他方法可以从 Parse.com 的列表中检索图像并将其设置为 imageview?

【问题讨论】:

    标签: android listview parse-platform bitmap android-image


    【解决方案1】:

    其实这段代码:

    listviewAdapter = new ListviewAdapter(ImageActivty.this, fileArrayList);
    lv.setAdapter(listviewAdapter);
    

    在这个之前运行

     if (e == null) {
                mProgress.setVisibility(View.INVISIBLE);
                for (ParseObject obj : list) {
                    ParseFile i = obj.getParseFile("Image");
                    fileArrayList.add(i);
                }
            } else {
                Toast.makeText(getApplicationContext(), "Error retrieving images: " + e.getMessage(), Toast.LENGTH_SHORT).show();
    
            }
    

    在大多数情况下,因为 findInBackground 是异步的。然后,一旦你的图片被加载,你必须通知你的适配器它的数据集已经改变了:

     listViewAdapter.notifyDataSetChanged();
    

    在这里做:

       if (e == null) {
                mProgress.setVisibility(View.INVISIBLE);
                for (ParseObject obj : list) {
                    ParseFile i = obj.getParseFile("Image");
                    fileArrayList.add(i);
                }
                listViewAdapter.notifyDataSetChanged();
            } else {
                Toast.makeText(getApplicationContext(), "Error retrieving   images: " + e.getMessage(), Toast.LENGTH_SHORT).show();
    
            }
    

    此时您也可以实例化和设置 listAdapter。

    【讨论】:

    • 我尝试在异步 findInBackground 方法中实例化它。这是行不通的。事实上,我得到一个用于设置适配器的空指针异常。即使我只使用 notifyDataSetChanged,我得到的只是一个空白屏幕。
    • 您确定您的图片被检索到了吗?
    • 是的。我检查了调试器。从 Parse.com 检索的每个对象都包含相应的图像。问题可能在于适配器的声明或图像从 Parsefile 到 byte[] 的转换。我已经使用 ParseImageview 完成了此操作,但我不确定如何在没有它的情况下完成此操作。此应用程序要求我不使用 ParseImageView。
    • 无论如何,你必须通知适配器。您也可以先在简单的 ImageView 上尝试在游览适配器之外进行游览转换。
    • 此外,当您使用 getParseFile() 时,您不会获得图像的数据。您必须在其上调用 getDataInBackground。您也可以使用 Picasso lib。
    【解决方案2】:

    嗯。我自己想通了。我不得不将 ParseQuery 和适配器移动到异步任务。这样,我只有在后台任务完成时才能操作适配器。 Thibault 给出的概念非常方便。另外,我使用通用图像加载器来执行图像的设置。我也试过用毕加索,效果也很好。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image_activty);
    
        new RemoteDataTask().execute();
    
    }
    
    private class RemoteDataTask extends AsyncTask<Void, Void, Void> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Create a progressdialog
            mProgressDialog = new ProgressDialog(ImageActivty.this);
            // Set progressdialog title
            mProgressDialog.setTitle("Images loading");
            // Set progressdialog message
            mProgressDialog.setMessage("Loading...");
            mProgressDialog.getProgress();
            mProgressDialog.setIndeterminate(false);
            // Show progressdialog
            mProgressDialog.show();
        }
    
        @Override
        protected Void doInBackground(Void... params) {
            // Create the array
            worldpopulationlist = new ArrayList<ParseImage>();
            try {
                // Locate the class table named "Country" in Parse.com
                ParseQuery<ParseObject> query = new ParseQuery<ParseObject>(
                        "Images");
                // Locate the column named "ranknum" in Parse.com and order list
                // by ascending
                ob = query.find();
                for (ParseObject country : ob) {
                    country.pinInBackground();
                    // Locate images in flag column
                    ParseImage parseImage = new ParseImage();
                    ParseFile image = (ParseFile) country.get("Image");
                    String objectID = country.getObjectId();
                    parseImage.setImage(image);
                    parseImage.setObjectID(objectID);
                    worldpopulationlist.add(parseImage);
                }
            } catch (ParseException e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return null;
        }
    
        @Override
        protected void onPostExecute(Void result) {
            // Locate the listview in listview_main.xml
            listview = (GridView) findViewById(R.id.listView);
            // Pass the results into ListViewAdapter.java
            adapter = new ListviewAdapter(ImageActivty.this,
                    worldpopulationlist);
            // Binds the Adapter to the ListView
            listview.setAdapter(adapter);
            // Close the progressdialog
            mProgressDialog.dismiss();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      相关资源
      最近更新 更多