图像未使用Picasso在RecyclerView中加载

时间:2017-09-07 11:40:43

标签: android android-recyclerview picasso android-glide

我调用一个Web服务,我得到一个包含许多数据的JSON,在解析之后我尝试在TextView中显示三个文本,在RecyclerView中显示ImageView中的一个图像。在这个数据中,所有三个TextView都从POJO获取了它的文本数据,但Image没有加载。我也尝试使用Picasso和Glide库。但它无法从服务器加载图像。

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.recyclerviewdemo">

<uses-permission android:name="android.permission.INTERNET" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>

的build.gradle

apply plugin: 'com.android.application'

android {
compileSdkVersion 26
buildToolsVersion "26.0.1"

defaultConfig {
    applicationId "com.example.recyclerviewdemo"
    minSdkVersion 15
    targetSdkVersion 26
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner 
    "android.support.test.runner.AndroidJUnitRunner"
}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 
'proguard-rules.pro'
    }
}

packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/DEPENDENCIES'
    }
}

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', 
{
    exclude group: 'com.android.support', module: 'support-annotations'
})
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:26.+'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.github.bumptech.glide:glide:3.5.2'
    compile 'com.android.volley:volley:1.0.0'
    compile 'org.apache.httpcomponents:httpcore:4.2.4'
    compile 'org.apache.httpcomponents:httpmime:4.3'
    compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
    compile 'com.android.support:cardview-v7:26.0.0-alpha1'
    compile 'com.squareup.picasso:picasso:2.5.2'
}

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_marginBottom="8dp"
    android:layout_height="match_parent"
    tools:context="com.example.recyclerviewdemo.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_service_provider_list"
        android:layout_width="368dp"
        android:layout_height="wrap_content"
        tools:layout_editor_absoluteY="0dp"
        tools:layout_editor_absoluteX="8dp" />

</LinearLayout>

service_provider_list_row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:card_view="http://schemas.android.com/apk/res-auto">

    <android.support.v7.widget.CardView
        android:id="@+id/card_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:layout_margin="10dp"
        android:elevation="10dp"
        card_view:cardCornerRadius="3dp">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:weightSum="4">

            <ImageView
                android:id="@+id/iv_profile_image"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:layout_gravity="left"
                android:layout_marginRight="16dp"
                android:layout_weight="3" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/tv_name"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentTop="true"
                    android:layout_marginBottom="10dp"
                    android:text="Name"
                    android:textSize="20dp"
                    android:textStyle="bold" />

                <TextView
                    android:id="@+id/tv_address"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@id/title"
                    android:layout_marginBottom="5dp"
                    android:text="Address" />

                <TextView
                    android:id="@+id/tv_description"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@id/title"
                    android:maxLines="1"
                    android:text="Description" />

            </LinearLayout>
        </LinearLayout>
    </android.support.v7.widget.CardView>
</LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {

private String TAG = "ServiceProviderList";
private ProgressDialog mProgressDialog;
private ArrayList<ServiceProvider> serviceProviderList;
private ServiceProviderAdapter mServiceProviderAdapter;
private RecyclerView rv_service_provider_list;
private RecyclerView.LayoutManager mLayoutManager;

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

    registerViews();
    init();

    rv_service_provider_list.setLayoutManager(mLayoutManager);
    rv_service_provider_list.setItemAnimator(new DefaultItemAnimator());
    rv_service_provider_list.setAdapter(mServiceProviderAdapter);

    fetchServiceProviderList();
}

private void fetchServiceProviderList() {
    mProgressDialog.setMessage("Downloading json...");
    mProgressDialog.show();

    JSONObject jsonParams = getJsonParams();
    CustomJsonObjectRequest req = new 
    CustomJsonObjectRequest(AppConfig.BASE_URL, jsonParams,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    Log.d(TAG, response.toString());
                    mProgressDialog.hide();
                    JSONArray dataJSONArrayObj = null;
                    try {
                        dataJSONArrayObj = response.getJSONArray("data");
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    serviceProviderList.clear();

                    for (int i = 0; i < dataJSONArrayObj.length(); i++) {
                        try {
                            JSONObject serviceProviderObjs = 
 dataJSONArrayObj.getJSONObject(i);
 ServiceProvider serviceProvider = new 
 ServiceProvider();

 serviceProvider.setServiceProviderId(Integer.parseInt
 (serviceProviderObjs.getString("service_provider_id").trim()));

 serviceProvider.setName(serviceProviderObjs.getString("name").trim());

 serviceProvider.setDescription(serviceProviderObjs.getString
 ("description").trim());

 serviceProvider.setLatitude(Double.parseDouble
 (serviceProviderObjs.getString("lat").trim()));

 serviceProvider.setLongitude(Double.parseDouble
 (serviceProviderObjs.getString("long").trim()));

 serviceProvider.setAddress(serviceProviderObjs.getString("address").
 trim());

 serviceProvider.setImage(serviceProviderObjs.getString("image").trim());

                            serviceProviderList.add(serviceProvider);
                        } catch (JSONException e) {
                            Log.e(TAG, "Json parsing error: " + 
 e.getMessage());
                        }
                    }

                    mServiceProviderAdapter.notifyDataSetChanged();

                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e(TAG, "Error: " + error.getMessage());
            mProgressDialog.hide();
        }
    });
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(req);
}

public JSONObject getJsonParams() {
    JSONObject rootJson = new JSONObject();
    try{
        rootJson.put("method", "service_provider_list");
        JSONObject jsonObject = new JSONObject();
        rootJson.put("params", jsonObject);
    } catch (Exception ex){
        ex.printStackTrace();
    }
    Log.d("JsonForming", rootJson.toString());
    return rootJson;
}

private void registerViews() {
    rv_service_provider_list = (RecyclerView) 
    findViewById(R.id.rv_service_provider_list);
}

private void init() {
    mProgressDialog = new ProgressDialog(this);
    serviceProviderList = new ArrayList<ServiceProvider>();
    mServiceProviderAdapter = new 
    ServiceProviderAdapter(serviceProviderList, MainActivity.this);
    mLayoutManager = new LinearLayoutManager(getApplicationContext());
}
}

ServiceProviderAdapter.java

public class ServiceProviderAdapter extends 
RecyclerView.Adapter<ServiceProviderAdapter.MyViewHolder> {

private Context mContext;
private ArrayList<ServiceProvider> serviceProviderList;
private ProgressBar mProgressDialog;

public ServiceProviderAdapter(ArrayList<ServiceProvider> 
serviceProviderList, Context mContext) {
    this.serviceProviderList = serviceProviderList;
    this.mContext = mContext;
    mProgressDialog = new ProgressBar(mContext);
}

public class MyViewHolder extends RecyclerView.ViewHolder {
    public TextView tv_name, tv_address, tv_description;
    public ImageView iv_profile_image;

    public MyViewHolder(View view) {
        super(view);
        iv_profile_image = (ImageView) 
view.findViewById(R.id.iv_profile_image);
        tv_name = (TextView) view.findViewById(R.id.tv_name);
        tv_address = (TextView) view.findViewById(R.id.tv_address);
        tv_description = (TextView) view.findViewById(R.id.tv_description);
    }
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext()).
inflate(R.layout.service_provider_list_row, parent, false);
    return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    ServiceProvider serviceProvider = serviceProviderList.get(position);

    /*Glide.with(mContext).load(serviceProvider.getImage())
            .thumbnail(0.5f)
            .crossFade()
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .into(holder.iv_profile_image);*/

    Picasso.with(mContext).load(serviceProvider.getImage())
        .fit()
        .centerCrop()
        .into(holder.iv_profile_image);

    holder.tv_name.setText(serviceProvider.getName());
    holder.tv_address.setText(serviceProvider.getAddress());
    holder.tv_description.setText(serviceProvider.getDescription());
    Log.d("ServiceProviderAdapter", "Adapting Data to Views");
}

@Override
public int getItemCount() {
    return serviceProviderList.size();
}
}

Output is coming like this

2 个答案:

答案 0 :(得分:0)

过去我使用Glide和RecyclerViews时遇到问题,不使用占位符。我建议尝试一下!

    Glide.with(mContext).load(serviceProvider.getImage())
        .thumbnail(0.5f)
        .crossFade()
        .placeholder(R.drawable.placeholder)
        .diskCacheStrategy(DiskCacheStrategy.ALL)
        .into(holder.iv_profile_image);

答案 1 :(得分:0)

也许你的问题不是毕加索,而是你的布局。

当您使用具有android:weightSum属性的LinearLayout和android:orientation =“horizo​​ntal”时,您必须将子宽度设置为0dp,因为它们的宽度由权重定义。