主要就是1.主活动类,2.需要去gradle引入要使用的包比如recycler,3.需要去注册文件注册主活动,才能正常运行App,4.需要res/layout中的主布局文件来配合代码中的view类来显示我们界面。
建议先从课本上了解下要使用的控件即相关功能和实现,然后不懂的每一句都去问ChatGpt
目录
效果:
上面横栏图片是我下载存到本地draw文件夹的图片。
下方新闻列表的图片用的是Picasso显示的URL。
目前每个分类更换下面的碎片成为的Recycler都是写死的。
比如Sports,下面的第一个项被我替换为了别的。经测试可以正常替换。
每个元素都是按钮,包括下面的文字图片。都有Toast响应。
代码分析:
Gradle中引入需要用的外部包,并及时sync
注册文件中注册了主活动,并且声明了访问网络的权限:
主布局中安排了最上方的横向列表和下面的碎片:
0dp指的是交给系统自己分配合适的空间大小。
无论是上方的选项还是下面的列表选项,每个选项都是单独的LinearLayout
上方布局:
使用”fitXY”可以使我的图片适应填充满目标区域
下方每项布局:
使用了singleLine = “flase” ,当文本足够长时,会自动换行。
活动:
主活动:
元素类:
就是简单的成员,构造,以及get
适配器Adapter:
这里重要的就是想给下面碎片更换,需要获取主活动,才能通过
getSupportFragmentManager()来获取碎片管理器。
类内类有ViewHolder,用来实现视图中显示每项元素的。
其余部分类似课本碎片节相关代码。
其中按钮功能:
获取到点击位置的元素,可以得到其结构体,就可以根据名字的不同来替换不同的下方列表碎片。
下方列表几乎和这个列表相同,只是做了些调整:
每个列表都有独立的实现。
Business的构造:
第一个图片的URL:
https://img0.baidu.com/it/u=743086653,3308529542&fm=253&fmt=auto&app=120&f=JPEG?w=539&h=305
本地drawable的图片:
参考上方列表的适配器代码:
修改自《第一行代码 第二版》中动态创建碎片一节
package com.example.myapplication2;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import androidx.recyclerview.widget.RecyclerView;
import androidx.fragment.app.Fragment;
import java.util.List;
public class NewsClassAdapter extends RecyclerView.Adapter<NewsClassAdapter.ViewHolder>{
private List<NewsClass>mNCList;
private FragmentActivity mActivity;
static class ViewHolder extends RecyclerView.ViewHolder{
View fruitView;
ImageView NCImage;
TextView NCName;
public ViewHolder(View view){
super(view);
fruitView = view;
NCImage = (ImageView) view.findViewById(R.id.nc_image);
NCName = (TextView) view.findViewById(R.id.nc_name);
}
}
public NewsClassAdapter(List<NewsClass> NClist,FragmentActivity activity)
{
mNCList = NClist;
mActivity = activity;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent,int viewType)
{
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.new_class_item,parent,false);
final ViewHolder holder = new ViewHolder(view);
holder.fruitView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
int position = holder.getAdapterPosition();
NewsClass nc = mNCList.get(position);
Toast.makeText(v.getContext(),"you clicked view " + nc.getName(),Toast.LENGTH_LONG).show();
if(nc.getName() == "Business")
replaceFragment(new BusinessFragment());
if(nc.getName() == "Entertainment")
replaceFragment(new Entertainment());
if(nc.getName() == "Health")
replaceFragment(new Health());
if(nc.getName() == "Science")
replaceFragment(new Science());
if(nc.getName() == "Sports")
replaceFragment(new Sports());
}
});
holder.NCImage.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v)
{
int position = holder.getAdapterPosition();
NewsClass nc = mNCList.get(position);
//replaceFragment(new BusinessFragment());
Toast.makeText(v.getContext(),"you clicked image " + nc.getName(),Toast.LENGTH_LONG).show();
if(nc.getName() == "Business")
replaceFragment(new BusinessFragment());
if(nc.getName() == "Entertainment")
replaceFragment(new Entertainment());
if(nc.getName() == "Health")
replaceFragment(new Health());
if(nc.getName() == "Science")
replaceFragment(new Science());
if(nc.getName() == "Sports")
replaceFragment(new Sports());
}
});
return holder;
}
private void replaceFragment(Fragment fragment)
{
FragmentManager fragmentManager = mActivity.getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.list, fragment);
transaction.addToBackStack(null);
transaction.commit();
}
@Override
public void onBindViewHolder(ViewHolder holder,int position){
NewsClass nc = mNCList.get(position);
holder.NCImage.setImageResource(nc.getImageId());
holder.NCName.setText(nc.getName());
}
@Override
public int getItemCount(){
return mNCList.size();
}
}