【问题标题】:How to show Array of images in recyclerview based on headline object from json Android如何根据来自json Android的标题对象在recyclerview中显示图像数组
【发布时间】:2017-08-24 09:11:43
【问题描述】:

我收到了来自 rest api 的 json 数据。该数据包含 id、title、body、一组图像“appImages”和一个 teaserImage。现在我反序列化控制器类中的 json。我已经创建了两个适配器。第一个适配器用于recyclerview。此回收器视图显示标题和 teasetImage。这部分工作。如果用户单击项目,它会重定向到详细活动,在那里他可以看到 teaserImage 作为封面图片,而 body 作为描述。现在我以这种方式组织了这个布局,首先 ImageView 用于封面图像,TextView 用于描述。在下面的描述中,我创建了一个 recyclerView 来显示图像数组。 CoverImage 和细节描述效果很好。对于 recyclerview,我创建了另一个 Adpater,此适配器用于根据新闻标题显示所有图像。但我坚持在 recyclerview 中显示这些图像。我已经在我的代码中详细解释了。

我的控制器类

public class NewsController {
private static final String TAG = NewsController.class.getSimpleName();
private UserCallbackListener mListener;
private NewsRestApiManager mApiManager;
private AppImage appImages;

public NewsController(UserCallbackListener listener) {
    mListener = listener;
    mApiManager = new NewsRestApiManager();
}

public void startFetching(){

    mApiManager.getNewsApi().getNews(new Callback<String>() {

        @Override
        public void success(String s, Response response) {
            Log.d(TAG, "JSON :: " + s);

            try {
                JSONArray array = new JSONArray(s);

                for(int i = 0; i < array.length(); i++) {
                    JSONObject jsonObject = array.getJSONObject(i);

                    NewsModel news = new NewsModel();
                    news.setTitle( jsonObject.optString( "title") );
                    news.setBody( jsonObject.optString( "body" ) );

                    ArrayList<AppImage> list = new ArrayList();
                    JSONArray imageArray =jsonObject.getJSONArray("appImages");
                    if (imageArray.length() > 1) {
                        for(int j=0; j<imageArray.length();j++){
                            appImages  = new AppImage();
                            appImages.setSrc(new JSONArray( s ).getJSONObject( i ).getJSONArray( "appImages" ).getJSONObject( j ).getString( "src" ));

                            list.add(appImages);

                        }

                    }
                    news.setAppImages( list );
                    TeaserImageSmall coverImage=new TeaserImageSmall();
                    coverImage.setSrc( new JSONArray( s ).getJSONObject( i ).getJSONObject( "teaserImageSmall" ).getString( "src" ));
                    news.setTeaserImageSmall(coverImage);
                    mListener.onFetchProgressNews(news);


                }
            } catch (JSONException e) {
                mListener.onFetchFailed();
            }

            mListener.onFetchComplete();
        }

        @Override
        public void failure(RetrofitError error) {
            Log.d(TAG, "Error :: " + error.getMessage());
            mListener.onFetchComplete();
        }
    });

}
public interface UserCallbackListener{
    void onFetchStart();
    void onFetchProgressNews(NewsModel news);
    void onFetchProgressNews(List<NewsModel> userList);


    void onFetchComplete();
    void onFetchFailed();
}

我的 News Recyclerview 适配器类。现在完美了。

    public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.NewsHolder>
    ........
 public void addNews(NewsModel news) {
        Log.d(TAG,news.getTeaserImageSmall().getSrc());
        mNews.add(news);
        notifyDataSetChanged();
    }

 @Override
public void onBindViewHolder(NewsHolder holder, int position) {
    final NewsModel currentNews = mNews.get(position);
    Picasso.with(holder.itemView.getContext());
    Picasso.with(holder.itemView.getContext()).load(currentNews.getTeaserImageSmall().getSrc()).into( holder.newsImage );

    holder.newsHeadline.setText(currentNews.getTitle());

    holder.cardView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Intent i=new Intent(context,DetailNews.class);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            i.putExtra("src",currentNews.getTeaserImageSmall().getSrc());
            i.putExtra("title",currentNews.getTitle());
            i.putExtra("body",currentNews.getBody());
            context.startActivity(i);
        }
    });

现在是图像数组的另一个适配器,它将详细显示新闻页面的活动。

编辑的适配器类

    public class NewsImageAdapter extends RecyclerView.Adapter<NewsImageAdapter.ImageHolder> {

    public static String TAG = NewsImageAdapter.class.getSimpleName();
    private Context context;
    private List<AppImage> appImageList;
    DetailNews detailNews  = new DetailNews  ();


    public NewsImageAdapter(List<AppImage> imageObject,Context context) {
        this.context = context;
        this.appImageList = imageObject;
    }
    public void addImage(AppImage appImage) {
        Log.d(TAG,appImage.getSrc());
        appImageList.add(appImage);
        notifyDataSetChanged();
    }
    @Override
    public ImageHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.newsdetail_image_row,parent,false);
        return new ImageHolder(view);
    }

    @Override
    public void onBindViewHolder(ImageHolder holder, int position) {
        final AppImage currentImage=appImageList.get(position);
        //getting error for current news, 
        detailNews .navigate(context, appImageList, currentNews.getTeaserImageSmall().getSrc(), currentNews.getTitle(),currentNews.getBody()); 
        Picasso.with(holder.itemView.getContext()).load(currentImage.getSrc()).into( holder.images);
    }

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

    public class ImageHolder extends RecyclerView.ViewHolder {

        public ImageView images;

        public ImageHolder(View itemView) {
            super(itemView);
            images= itemView.findViewById(R.id.news_image);
        }
    }
}

此时我正在拍摄封面图片和描述的新闻的详细活动。但我也想在描述下方显示图像列表。我想知道如何实现。

编辑的详细信息活动

public class DetailNews extends AppCompatActivity{


public class DetailNews extends AppCompatActivity{

private RecyclerView recyclerView;
private NewsImageAdapter adapter;
private List<AppImage> imageList= new ArrayList<>();
private NewsController mController;
private CardView cardview;
private ImageView _coverImage;
private TextView _newsHeading;
private TextView _description;
private TextView _newsDate;
private static List<AppImage> appImageList,mAppImageList;


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

    //newsObject=getAllImageList();

    // setting up views and stuff
    setUpUIViews();

    Intent intent = getIntent();

    //RECEIVE DATA
    Log.e("_coverImage",""+_coverImage);
    String coverImage = intent.getStringExtra ("src");
    String heading=intent.getExtras().getString("title");
    //String newsDate=intent.getExtras().getString("date");
    String description=intent.getExtras().getString("body");

    //BIND DATA

    Picasso.with(this).load(coverImage ).into(_coverImage);
    _newsHeading.setText(heading);
    // _newsDate.setText(newsDate);
    _description.setText(description);
    Linkify.addLinks( _description,Linkify.WEB_URLS );

}

private void setUpUIViews() {
    _coverImage=(ImageView)findViewById(R.id.news_cover);
    _newsHeading=(TextView)findViewById(R.id.heading);
    _description=(TextView)findViewById(R.id.news_description);
    _newsDate=(TextView)findViewById(R.id.date);

    cardview=(CardView) findViewById(R.id.cardView);
    recyclerView = (RecyclerView)findViewById(R.id.image_list);
    recyclerView.setHasFixedSize(true);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(DetailNews.this);
    recyclerView.setLayoutManager(layoutManager);
    adapter = new NewsImageAdapter(imageList,getApplicationContext() );
    recyclerView.setAdapter(adapter);

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    if (id == android.R.id.home) {
        finish();
    }
    return super.onOptionsItemSelected(item);
}

public void navigate(Context activity, List<AppImage> appImageList, String  src, String  title, String  body) {

    mAppImageList = appImageList;

    Intent intent = new Intent(activity, DetailNews  .class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.putExtra("src",src);
    intent .putExtra("title",title);
    intent .putExtra("body",body);
    activity.startActivity(intent);
    try {
        if (activity instanceof NewasPage) { //Error for news
            ((NewsPage) activity).finish();
        }

    } catch (Exception e) {
        e.printStackTrace();
      }
   }


}

我的 Mdel 类是

public class NewsModel {

@Expose
private String _id;

@Expose
private String body;

@Expose
private String title;

@Expose
private List<AppImage> appImages;

public List<AppImage> getAppImages() {
    return appImages;
}

public void setAppImages(List<AppImage> appImages) {
    this.appImages = appImages;
}

AppImage 模型类

    public class AppImage {
    @Expose
    private String _id;

    @Expose
    private String alt;

    @Expose
    private String src;

    public String get_id() {
        return _id;
    }

    public void set_id(String _id) {
        this._id = _id;
    }

    public String getAlt() {
        return alt;
    }

    public void setAlt(String alt) {
        this.alt = alt;
    }

    public String getSrc() {
        return src;
    }

    public void setSrc(String src) {
        this.src = src;
    }
}

【问题讨论】:

  • 你在哪里将 appImages 传递给第二个活动?
  • @SibinDavis 在那种情况下,我已经卡住了,在控制器类中我创建了接口 onFetchProgressNews(NewsModel news);然后在新闻适配器上,我创建了方法 addNews,该方法在新的 Mainactivity 中添加了新闻。但是在这种情况下,我如何在详细活动中添加 imgelist
  • 第二页最好用Fragment,这样传递对象就方便了。
  • 我通过实现 NewsController.UserCallbackListener 在主 recyclerview 中获得新闻,然后 mController = new NewsController(NewsPage.this); mController.startFetching();然后@Override public void onFetchProgressNews(NewsModel news) { adapter.addNews(news); }
  • 但是我已经将我的代码设置为活动。我不想改变它。片段处理对我来说仍然很复杂

标签: android arrays json android-activity android-recyclerview


【解决方案1】:

在DetailNews Activity中,添加一个方法

private static List<AppImage> appImageList mAppImageList; 



            public void navigate(Context activity, List<AppImage> appImageList,String  src,String  title,String  body) {

                    mAppImageList = appImageList;

                    Intent intent = new Intent(activity, DetailNews  .class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                 intent.putExtra("src",src);
                intent .putExtra("title",title);
                intent .putExtra("body",body);
                    activity.startActivity(intent);
                    try {
                        if (activity instanceof FirstActivity) {
                            ((FirstActivity) activity).finish();
                        }

                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

并在适配器中执行

DetailNews  detailNews  = new DetailNews  ();
                                        detailNews  .navigate(context, appImageList, currentNews.getTeaserImageSmall().getSrc(), currentNews.getTitle(),currentNews.getBody());

【讨论】:

  • 这一行是否正确 private static List appImageList mAppImageList;
  • 是的。它是在 DetailNews 活动中使用的图像列表。
  • 这一行出现错误 (activity instanceof FirstActivity) { ((FirstActivity) activity).finish()
  • 我已经创建了新闻页面类,这是我的第一个活动。但这里是显示错误
  • 我在哪里可以写这行? detailNews .navigate(context, appImageList, currentNews.getTeaserImageSmall().getSrc(), currentNews.getTitle(),currentNews.getBody());在哪个适配器中
猜你喜欢
  • 2013-02-03
  • 2013-05-31
  • 2021-08-28
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多