【问题标题】:ArrayList<ArrayList<String>> vs ArrayList<Object>ArrayList<ArrayList<String>> 与 ArrayList<Object>
【发布时间】:2017-01-02 18:33:47
【问题描述】:

如果我使用ArrayList&lt;ArrayList&lt;String&gt;&gt; 代替ArrayList&lt;Object&gt; 来填充recyclerView,会有什么问题吗?还是我是这里唯一的怪人?

我在每个列表项中都有图片链接。有些也没有任何图片链接。

我在显示列表时第一次保存图像,然后如果图像名称匹配,则从 sdcard 中获取图像。我也有独特的图像名称。

当我滚动视图时,不包含任何图像的项目也会显示以前加载的图像,但不会复制文本。

我也在用

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

@Override
public int getItemViewType(int position) {
    return position;
}

我的适配器中的这些函数。

Adapter.java

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

ImageLoader imageLoader = AppController.getInstance().getImageLoader();

public class MyViewHolder extends RecyclerView.ViewHolder {

    public TextView text,date;
    public ImageView image;

    public MyViewHolder(View view) {
        super(view);

        text = (TextView) view.findViewById(R.id.text);
        date = (TextView) view.findViewById(R.id.date);
        image = (ImageView) view.findViewById(R.id.image);
    }
}

Context context;
Bitmap bitmap;

public ChatBoxAdapter(Context _context) {
    context = _context;
}

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

    return new MyViewHolder(itemView);
}

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

    String comment = Base.chatdatalist.get(position).get(3);
    String image_url = Base.chatdatalist.get(position).get(4);
    String date = Base.chatdatalist.get(position).get(5);

    File imageFile = null;

    if (image_url.startsWith(Base.baseUrl)) {

        String image_name = image_url.substring(image_url.lastIndexOf("/")+1);
        imageFile = new File(Environment.getExternalStorageDirectory().getPath() + "/Pictures/TMS Sent Images/" + image_name);
        bitmap = null;
        if (imageFile.exists()) {

            BitmapFactory.Options options = new BitmapFactory.Options();

            long img_size = imageFile.length() / 1024;
            if (img_size <= 200)
                options.inSampleSize = 4;
            else
                options.inSampleSize = 8;

            bitmap = BitmapFactory.decodeFile(imageFile.toString(), options);
        }
    }

    holder.text.setText(Html.fromHtml(comment, null, new MyTagHandler()));

    if (position !=0 && !chat_date.equals(Base.chatdatalist.get(position - 1).get(15)))
        holder.date.setVisibility(View.VISIBLE);
    if (position == 0)
        holder.date.setVisibility(View.VISIBLE);


    if (bitmap != null) {
        holder.image.setImageBitmap(bitmap);
        holder.image.setVisibility(View.VISIBLE);
    } else
        if (image_url.startsWith(Base.baseUrl)) {
            holder.image.setVisibility(View.VISIBLE);
            Picasso.with(context).load(image_url).into(holder.image);
        }
}

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

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

@Override
public int getItemViewType(int position) {
    return position;
}
}

可能是什么问题?

提前致谢。

【问题讨论】:

  • 这个问题不清楚,你有一个arraylist 的arraylist 表明你的数据存在一对多类型的关系,例如,一个列表项可能有多个路径,是这样吗?
  • 这些功能在大多数适配器中,发布您的完整适配器代码
  • 是的……假设我有一个数组列表commentData,我可以做到commentData.add(arrayList);
  • 您是否尝试将具有字符串值的 ArrayLists 存储在 ArrayList 中?目的是什么?
  • 代替 ArrayList 我只是使用 ArrayList>。这是错的吗?目的是我觉得它很容易实现和存储……

标签: android arraylist android-recyclerview adapter android-viewholder


【解决方案1】:

好吧,如果您不介意每次都投射:ArrayList&lt;String&gt; foo = (ArrayList&lt;String&gt;) commentData.get(i) 而不是 ArrayList&lt;String&gt; x = commentsData.get(i),当然,请使用 ArrayList&lt;Object&gt;

【讨论】:

  • 我用commentData.get(i).get(j);
  • 您了解在List 上指定&lt;String&gt; 的好处吗?
  • 包含字符串对象的列表?
  • 是的,它指定集合将只包含字符串,因此当您需要从集合中提取时,您不需要强制转换为类型
  • 所以这两种方法在可访问性方面并没有太大的区别,只需选择一个并使用它运行
猜你喜欢
  • 2014-07-31
  • 1970-01-01
  • 2018-03-16
  • 1970-01-01
  • 2015-08-06
  • 2010-09-28
  • 2013-07-02
相关资源
最近更新 更多