在我的应用程序中,我正在使用回收器视图和改造来加载新闻标题,描述和图像。由于我是动态加载的,因此每个回收器视图适配器项都会从不同的URL加载新闻标题,因此我希望我的用户在单击特定的适配器行项时阅读webView上的详细新闻。我不知道如何实现此功能。我想以这样一种方式呈现,考虑回收器视图适配器项目是否包含来自带有该图像的 URL 的"新闻 1",如果用户单击适配器项目,则该特定 URL 以及新闻和图像应该加载到单独的 webView 中。同样,如果用户单击任何适配器项,则与行项对应的 URL 应在 webView 中单独加载
下面是示例响应:
{
"status": "success",
"msg": "news_list",
"news_details": [
{
"title": "news title",
"image": "",
"description": "<img src='https://images.link.com",
"link": "https://www.somenewslink.com/news.html",
"view_link": "https://www.somenewslink.com/news.html",
"provider": "NewsProvider"
}
这是我的自定义适配器:
public class FragmentOneAdapter extends RecyclerView.Adapter<FragmentOneAdapter.MyViewHolder>{
Context context;
Activity mActivity;
List<NewsList> newsList = new ArrayList<>();
public static final String TAG = FragmentOneAdapter.class.getSimpleName();
public FragmentOneAdapter(Activity activity, List<NewsList> newsList){
this.mActivity = activity;
this.newsList = newsList;
}
@Override
public FragmentOneAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_one, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(FragmentOneAdapter.MyViewHolder holder, final int position) {
Log.e(TAG, "size==>"+ newsList.size());
holder.newsTitle.setText(newsList.get(position).title);
holder.description_tView.setText(newsList.get(position).description);
holder.provider_tView.setText(newsList.get(position).provider);
try {
if (!newsList.get(position).image.equals("")) {
if (newsList.get(position).image != null) {
Picasso
.with(mActivity)
.load(newsList.get(position).image)
.into(holder.newsImageView);
holder.newsImageView.setScaleType(ImageView.ScaleType.FIT_XY);
} else {
Log.e(TAG, "_image_empty==>");
}
} else {
Log.e(TAG, "_image_empty==>");
// Toast.makeText(HomeActivity.this, "profile_image is Empty", Toast.LENGTH_SHORT).show();
}
}catch (NullPointerException e){
Toast.makeText(context, ""+e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
@Override
public int getItemCount(){
return newsList.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder{
TextView newsTitle;
TextView description_tView;
TextView provider_tView;
ImageView newsImageView;
LinearLayout click;
public MyViewHolder(View itemView) {
super(itemView);
newsImageView = (ImageView)itemView.findViewById(R.id.newsImageView);
description_tView = (TextView) itemView.findViewById(R.id.description_tView);
provider_tView = (TextView)itemView.findViewById(R.id.provider_tView);
newsTitle = (TextView)itemView.findViewById(R.id.newsTitle);
click = (LinearLayout)itemView.findViewById(R.id.click);
}
}
}
这就是我在主片段类中对它的称呼:
public class OneFragment extends Fragment{
RecyclerView recyclerView;
RetrofitInterface apiInterface;
Activity activity;
FragmentOneAdapter fragmentOneAdapter;
public List<NewsList> newsLists;
public static final String TAG = OneFragment.class.getSimpleName();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_one, container, false);
activity = getActivity();
Initialization(view);
return view;
}
public void Initialization(View view){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(RetrofitInterface.serverUrl)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
apiInterface = retrofit.create(RetrofitInterface.class);
GetNews();
recyclerView = (RecyclerView)view.findViewById(R.id.recyclerView);
recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), recyclerView, new RecyclerTouchListener.ClickListener() {
@Override
public void onClick(View view, int position) {
Toast.makeText(getActivity(),"This recyclerview has been clicked",Toast.LENGTH_SHORT).show();
}
@Override
public void onLongClick(View view, int position) {
}
}));
}
public void GetNews(){
Log.e(TAG, "GetNews==>");
CommonRequest commonRequest = new CommonRequest();
commonRequest.user_id = "1";
commonRequest.language_id = "1";
commonRequest.type_id = "10";
final Call<ListDetails>newslist = apiInterface.news(commonRequest);
newslist.enqueue(new Callback<ListDetails>() {
@Override
public void onResponse(Call<ListDetails> call, Response<ListDetails> response) {
if (response.body() != null) {
if (response.body().status.equalsIgnoreCase("success")) {
if (!response.body().news_details.isEmpty()) {
if (response.body().news_details != null) {
newsLists = response.body().news_details;
Log.e(TAG, "list_size ==>" + newsLists);
LinearLayoutManager layoutManager = new LinearLayoutManager(activity);
fragmentOneAdapter = new FragmentOneAdapter(activity, newsLists);
recyclerView.setAdapter(fragmentOneAdapter);
recyclerView.setLayoutManager(layoutManager);
fragmentOneAdapter.notifyDataSetChanged();
}else {
Log.e(TAG, "list_empty==>");
}
}else {
Log.e(TAG, "list_empty==>");
}
}else {
Toast.makeText(activity, response.body().msg, Toast.LENGTH_LONG).show();
}
}
}
@Override
public void onFailure(Call<ListDetails> call, Throwable t) {
Toast.makeText(getActivity(),"Server Busy",Toast.LENGTH_LONG).show();
}
});
}
}
如果我没有误解,你有新闻标题的Recycler view
和新闻细节的webview
?
在这种情况下,可以告诉webview
在触发项的onClick
方法时加载News URL
。
recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), recyclerView, new RecyclerTouchListener.ClickListener() {
@Override
public void onClick(View view, int position) {
// Load your URL here
// WebView.loadURL(newsList[position].view_link) or etc
}
@Override
public void onLongClick(View view, int position) {
}
));
如果您想加载新页面,只需使用 WebView 将 url 推送到Bundle
的新Activity
/Fragment
并显示它。