【问题标题】:Display URL image in sqlite在 sqlite 中显示 URL 图片
【发布时间】:2016-06-23 07:24:40
【问题描述】:

在我的应用程序中,我成功地从网络服务器检索图像列表。它们被读取为 url,即

http://mw2.google.com/mw-panoramio/photos/medium/131093147.jpg

等等。

我将图像作为字符串 url 存储在 SQLite 中。但现在我想在回收站视图中显示它们。

这是我的适配器。

public class MySQLAdapter extends RecyclerView.Adapter<MySQLAdapter.RowHolderClass> {

private List<SQLiteModel> myList;
private Context mContext;
private int focused;


public MySQLAdapter(Activity activity,ArrayList<SQLiteModel> ss) {
    this.myList = ss;
    this.mContext=activity;
}

@Override
public MySQLAdapter.RowHolderClass onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_row, null);

    final RowHolderClass holder = new RowHolderClass(v);
    return holder;
}

@Override
public void onBindViewHolder(RowHolderClass holder, int position) {

    final SQLiteModel listItems = myList.get(position);
    holder.itemView.setSelected(focused==position);

    holder.getLayoutPosition();

    holder.fName.setText(myList.get(position).getSqliteFirstName());
    holder.lName.setText(myList.get(position).getSqliteSecondName());
    holder.jobRole.setText(myList.get(position).getSqliteRole());
    //holder.imageView.setImageResource(Integer.parseInt(myList.get(position).getSqliteImage()));
    holder.relativeLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String first_name = listItems.getSqliteFirstName();
            String last_name = listItems.getSqliteSecondName();
            String job_role = listItems.getSqliteRole();
            //String image_url = listItems.get();
            //String id= String.valueOf(listItems.getSqliteId());
            //Log.v("id",id);
            Intent i = new Intent(mContext, NoInternetDetailedActivity.class);
            i.putExtra("firstName",first_name);
            i.putExtra("lastName",last_name);
            i.putExtra("jobRole",job_role);
            //i.putExtra("imageUrl",image_url);
            //i.putExtra("memberId",id);
            mContext.startActivity(i);
        }
    });

}


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


//ViewHolder pattern used to read the data of the row fast.
class RowHolderClass extends RecyclerView.ViewHolder {

    protected NetworkImageView imageView;
    protected TextView fName, lName, jobRole;
    protected RelativeLayout relativeLayout;

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

        this.relativeLayout = (RelativeLayout) itemView.findViewById(R.id.recLayout);
        this.imageView = (NetworkImageView) itemView.findViewById(R.id.imageView);
        this.fName = (TextView) itemView.findViewById(R.id.firstName);
        this.lName = (TextView) itemView.findViewById(R.id.lastName);
        this.jobRole = (TextView) itemView.findViewById(R.id.roleView);

    }
  }
 }

我将onBindViewHolder中的其余数据显示为

holder.fName.setText(myList.get(position).getSqliteFirstName());
holder.lName.setText(myList.get(position).getSqliteSecondName());
holder.jobRole.setText(myList.get(position).getSqliteRole());

我想我需要在该方法中将 URL 字符串转换为字节数组。我不知道。有什么想法吗?

还有别的。当我点击 recyclerview 的行时,出现以下异常。

 java.lang.NullPointerException: Attempt to invoke virtual method 
'java.lang.String android.content.Context.getPackageName()' on a null object   
 reference

 at android.content.ComponentName.<init>(ComponentName.java:77)

这就是我的 recyclerview 没有图像时的样子。

  public void fetchDataFromDB() {

    dba = new DatabaseHandler(getApplicationContext());

    ArrayList<SQLiteModel> membersDB = dba.getMembersDetails();

    for(int i=0; i<membersDB.size();i++){
        int id = membersDB.get(i).getSqliteId();
        String fname = membersDB.get(i).getSqliteFirstName();
        String lname = membersDB.get(i).getSqliteSecondName();
        String role = membersDB.get(i).getSqliteRole();
        String image = membersDB.get(i).getSqliteImage();

        //String desc = moviesFromDB.get(i).getContent();
        SQLiteModel f = new SQLiteModel();
        f.setSqliteId(id);
        f.setSqliteFirstName(fname);
        f.setSqliteSecondName(lname);
        f.setSqliteRole(role);
        f.setSqliteImage(image);
        myarr.add(f);

    }
    dba.close();
}

}

【问题讨论】:

  • 你有NetworkImageView,目前使用的越来越少。我建议您使用 Picasso 库将其更改为标准 ImageView +,然后您可以通过以下方式加载图像: Picasso.with(getContext()).load(myList.get(position).getUrl()).into(holder.imageView );
  • 我得到了这个异常。 java.lang.IllegalArgumentException: 上下文不能为空。
  • 试试:Picasso.with(holder.image‌​View.getContext()).load(myList.get(position).getUrl()).into(holder.image‌​View);跨度>
  • 是的!!!!!!!谢谢你!!!
  • np。添加我的评论作为答案

标签: android image sqlite android-recyclerview


【解决方案1】:

使用 Picasso

这是一个非常简单的库,可让您下载和缓存图像。

所以在你的情况下你应该写这样的东西:

Picasso.with(mContext)
.load(myList.get(position).getSqliteImage())
.into(holder.imageView);

【讨论】:

  • 是的,我知道 picasso,我使用 sqlite 在网络关闭时将数据加载到回收站视图中。
  • 我认为picaso可以处理缓存。您说您将图像存储为 url,而不是位图。另外,考虑一下stackoverflow.com/questions/9357668/…
  • 好的。还有别的。当我单击一行时,我得到了问题中描述的异常。
  • 尝试使用调试模式来追踪为什么你的上下文为空。目前尚不清楚是什么导致了这个问题。
  • 没关系。问题已解决:)
【解决方案2】:

您有 NetworkImageView,目前使用的越来越少。我建议您使用 Picasso 库将其更改为标准 ImageView +,然后您可以通过以下方式加载图像:

Picasso.with(holder.image‌​View.getContext()).load(myList.get(position).getUrl()‌​).into(holder.image‌​View);

【讨论】:

    【解决方案3】:

    感谢 Mateusz Pryczkowski

    图片的答案是:

     Picasso.with(holder.imageView.getContext())
                .load(myList.get(position).getSqliteImage()).into(holder.imageView);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-24
      • 2021-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-19
      • 1970-01-01
      相关资源
      最近更新 更多