繁体   English   中英

显示从服务器检索的图像

[英]Displaying image retrieved from server

我正在开发一个Android应用,其中用户上传了一张照片。 现在,我正在从服务器调用一个方法,这将向我返回用户列表。 我想与照片一起显示此列表。 存储在服务器中的图像按字节数组排列。 所以我将它们转换为String,然后转换为Bitmap进行显示。 不幸的是,它不起作用,因为我也正在使用适配器。 在适配器类中检索到的图像为空。 我究竟做错了什么?

OtherUsers.java:

public class OtherUsers extends Activity {

    private PersonServiceImpl personService = new PersonServiceImpl();

    private static volatile List<RestPerson> restPersonList = new ArrayList<>();

    public static final String firstName = "firstname";
    public static final String userImage = "userimage";

    static final Long userId = (long)0;
    ListView listView;
    UserAdapter userAdapter;

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

        restPersonList = this.personService.getOtherUsers();
       // Base64 base64Encoder = new Base64();

        ArrayList<HashMap<String, String>> usersArrayHashList = new ArrayList<>();
        for(RestPerson restPerson : restPersonList){
            HashMap<String, String> restDisplay = new HashMap<>();
            restDisplay.put("userId",String.valueOf(restPerson.getUserId()));
            restDisplay.put("firstName",restPerson.getFirstName());

           restDisplay.put("userImage","data:image/png;base64," + Base64.encode(restPerson.getProfilePhoto()));
            usersArrayHashList.add(restDisplay);
        }

        listView = (ListView) findViewById(R.id.usersdisplaylist);

        userAdapter = new UserAdapter(this,usersArrayHashList);

        listView.setAdapter(userAdapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                Long userid = restPersonList.get(position).getUserId();
                Log.d("Userid is ", String.valueOf(userid));
            }

        });

UserAdapter类:

public class UserAdapter extends BaseAdapter {

    private Activity activity;
    private ArrayList<HashMap<String, String>> data;
    private static LayoutInflater inflater = null;

    public UserAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
        activity = a;
        data = d;
        inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }


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

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        if (convertView == null)
            view = inflater.inflate(R.layout.userprofiles, null);

        TextView username = (TextView) view.findViewById(R.id.userName);
        ImageView userImage = (ImageView) view.findViewById(R.id.userImage);
        HashMap<String, String> usersList = new HashMap<>();
        usersList = data.get(position);
       username.setText(usersList.get(OtherUsers.firstName));
        String image = usersList.get(OtherUsers.userImage);
        Log.d("Image is ",image);
        byte[] newImageBytes = image.getBytes();
        Bitmap bitmap = BitmapFactory.decodeByteArray(newImageBytes,0,newImageBytes.length);
        userImage.setImageBitmap(bitmap);
        userImage.setImageBitmap(null);
        return view;
    }
}

如果需要其他信息,请告诉我。 谢谢。

更新对不起,忘了放LogCat

08-24 13:43:16.618  29948-29948/internetlegion.com.gradlecheck E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: internetlegion.com.gradlecheck, PID: 29948
    java.lang.NullPointerException: println needs a message
            at android.util.Log.println_native(Native Method)
            at android.util.Log.d(Log.java:139)
            at internetlegion.com.gradlecheck.Adapters.UserAdapter.getView(UserAdapter.java:62)
            at android.widget.AbsListView.obtainView(AbsListView.java:2347)
            at android.widget.ListView.measureHeightOfChildren(ListView.java:1270)
            at android.widget.ListView.onMeasure(ListView.java:1182)
            at android.view.View.measure(View.java:17547)

您在适配器中使用的数据结构非常奇怪。 最好创建一个具有三个属性的类,然后将其中一个列表发送给适配器类。 无论如何,您的问题是:

public static final String userImage = "userimage";

您定义userImage与价值userimage ,那么您将与“userImage”这是不符合价值相等的HashMap userImage (价值具有较低的情况下,我),那么你已经尝试从没有存在的HashMap得到“userimage”,所以价值空值。

回答:

您可以更改以下行:

restDisplay.put("userImage","data:image/png;base64," + Base64.encode(restPerson.getProfilePhoto()));

restDisplay.put(userImage,"data:image/png;base64," + Base64.encode(restPerson.getProfilePhoto()));

但更好的方法是创建自定义对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM