使用RecyclerView获取xml数据(的数据)并解析展示(二)
发布时间
阅读量:
阅读量
步骤和第一篇基本没有区别,在本篇当中,给大家新增一个知识点,给recyclerview的每一项添加点击事件的过程。
第一步:导包
第二步:绘制布局
首先绘制activity所对应的页面的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.animee.day20.MainActivity">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
app:logo="@mipmap/ic_launcher"
app:title=" → 版主推荐-技术区帖子讨论列表"
app:titleTextColor="#FFF" />
<android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
html

然后绘制每一个item所对应的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp">
<TextView
android:id="@+id/item_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="@color/colorAccent"
android:text="关于ClientWebSocket的异步转同步,我把这个项目搬出来,讲讲清楚" />
<TextView
android:id="@+id/item_summary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="14sp"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:text="关于ClientWebSocket的异步转同步,我把这个项目搬出来,讲讲清楚" />
<TextView
android:id="@+id/item_author"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="14sp"
android:text="作者:shawb" />
<ImageView
android:layout_width="match_parent"
android:layout_height="2dp"
android:background="@color/colorPrimary"
android:layout_marginTop="10dp"/>
</LinearLayout>
html

第三部:开始写逻辑代码
首先写工具类:(网络请求的工具类)
public class HttpUtils {
public static String getStringByOkHttp(String path){
// 1.客户端对象
OkHttpClient client = new OkHttpClient();
// 2.请求对象
Request request = new Request.Builder().get().url(path).build();
// 3.开始执行请求,获取响应对象
try {
Response response = client.newCall(request).execute();
// 4.判断响应是否成功
if (response.isSuccessful()) {
// 5.获取响应体内容
ResponseBody body = response.body();
return body.string();
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
java

然后写解析的集合当中的类型表示的类:
public class EntryBean {
private String title;
private String summary;
private String author;
public EntryBean() {
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
java

然后把RecyclerView所对应的适配器编写出来:
public class EntryAdapter extends RecyclerView.Adapter<EntryAdapter.EntryViewHolder>{
private Context context;
private List<EntryBean>mDatas;
public EntryAdapter(Context context, List<EntryBean> mDatas) {
this.context = context;
this.mDatas = mDatas;
}
@Override
public EntryViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(context).inflate(R.layout.item_rv,parent,false);
EntryViewHolder holder = new EntryViewHolder(itemView);
return holder;
}
@Override
public void onBindViewHolder(EntryViewHolder holder, int position) {
final EntryBean bean = mDatas.get(position);
holder.titleTv.setText(bean.getTitle());
holder.summaryTv.setText(bean.getSummary());
holder.authorTv.setText("作者:"+bean.getAuthor());
// 添加每一项的点击事件
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context,bean.getTitle(),Toast.LENGTH_SHORT).show();
}
});
}
@Override
public int getItemCount() {
return mDatas.size();
}
class EntryViewHolder extends RecyclerView.ViewHolder{
TextView titleTv,summaryTv,authorTv;
public EntryViewHolder(View itemView) {
super(itemView);
titleTv = (TextView) itemView.findViewById(R.id.item_title);
summaryTv = (TextView) itemView.findViewById(R.id.item_summary);
authorTv = (TextView) itemView.findViewById(R.id.item_author);
}
}
}
java

最后编写页面当中的逻辑代码:
public class MainActivity extends AppCompatActivity {
private Toolbar toolbar;
private RecyclerView rv;
private LinearLayoutManager manager;
private List<EntryBean> mDatas;
private EntryAdapter adapter;
public String url = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 查找控件
toolbar = (Toolbar) findViewById(R.id.toolbar);
rv = (RecyclerView) findViewById(R.id.rv);
// 设置布局管理器
manager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
rv.setLayoutManager(manager);
// 设置数据源
mDatas = new ArrayList<>();
// 设置适配器
adapter = new EntryAdapter(this,mDatas);
rv.setAdapter(adapter);
// 获取网络数据
loadWebData(url);
}
private void loadWebData(final String url) {
// 加载网络数据的方法
new AsyncTask<Void,Void,String>(){
@Override
protected String doInBackground(Void... params) {
String s = HttpUtils.getStringByOkHttp(url);
return s;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
if (s!=null) {
// 解析数据
List<EntryBean> beanList = ParseXMLData.parseXml(s);
// 将网络的集合添加到数据源当中
mDatas.addAll(beanList);
// 提示数据更新
adapter.notifyDataSetChanged();
}
}
}.execute();
}
}
java

在获取当网络数据之后,要对于网络数据进行解析:
public class ParseXMLData {
public static List<EntryBean> parseXml(String s){
List<EntryBean>mDatas = new ArrayList<>();
// 1.工厂 2,解析器 3,设置解析数据 4.获取解析码
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser pullParser = factory.newPullParser();
ByteArrayInputStream baos = new ByteArrayInputStream(s.getBytes());
pullParser.setInput(baos,"utf-8");
int type = pullParser.getEventType();
EntryBean bean = null;
while (type != XmlPullParser.END_DOCUMENT) {
String name = pullParser.getName();
switch (type) {
case XmlPullParser.START_TAG:
if (name.equals("entry")) {
bean = new EntryBean();
}else if (name.equals("title")) {
if (bean!=null) {
bean.setTitle(pullParser.nextText());
}
}else if (name.equals("summary")) {
bean.setSummary(pullParser.nextText());
}else if (name.equals("author")) {
bean.setAuthor(pullParser.nextText());
}
break;
case XmlPullParser.END_TAG:
if (name.equals("entry")) {
mDatas.add(bean);
}
break;
}
type = pullParser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
return mDatas;
}
}
java

最后要添加网络权限,在清单文件当中!!!!
全部评论 (0)
还没有任何评论哟~
