android - 如何在自定义 Gridview 中显示项目?
问题描述
我正在尝试创建一个简单的新闻应用程序,我能够在列表视图中显示数据,但我想以网格格式显示它。我不知道如何实现这一点。请支持
更新代码
包 com.journaldev.androidrssfeedtutorial;
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.IdRes;
import android.support.annotation.LayoutRes;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
public class RSSFeedActivity extends AppCompatActivity {
private ProgressBar pDialog;
ArrayList<HashMap<String, String>> rssItemList = new ArrayList<>();
RSSParser rssParser = new RSSParser();
Toolbar toolbar;
GridView gridView;
List<RSSItem> rssItems = new ArrayList<>();
private static String TAG_TITLE = "title";
private static String TAG_LINK = "link";
private static String TAG_DESCRIPTION = "description";
private static String TAG_PUB_DATE = "pubDate";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rss_feed);
String rss_link = getIntent().getStringExtra("rssLink");
new LoadRSSFeedItems().execute(rss_link);
/* ListView lv = getListView();
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent in = new Intent(getApplicationContext(),
MainActivity.class);
String page_url = ((TextView)
view.findViewById(R.id.page_url)).getText().toString().trim();
in.putExtra("url", page_url);
startActivity(in);
}
});*/
}
public class LoadRSSFeedItems extends AsyncTask<String, String,
String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressBar(RSSFeedActivity.this, null,
android.R.attr.progressBarStyleLarge);
RelativeLayout relativeLayout = findViewById(R.id.relativeLayout);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT
);
lp.addRule(RelativeLayout.CENTER_IN_PARENT);
pDialog.setLayoutParams(lp);
pDialog.setVisibility(View.VISIBLE);
relativeLayout.addView(pDialog);
}
@Override
protected String doInBackground(String... args) {
// rss link url
String rss_url = args[0];
// list of rss items
rssItems = rssParser.getRSSFeedItems(rss_url);
// looping through each item
for (RSSItem item : rssItems) {
// creating new HashMap
if (item.link.toString().equals(""))
break;
HashMap<String, String> map = new HashMap<String, String>();
// adding each child node to HashMap key => value
String givenDateString = item.pubdate.trim();
SimpleDateFormat sdf = new SimpleDateFormat("EEE, d MMM yyyy
HH:mm:ss Z");
try {
Date mDate = sdf.parse(givenDateString);
SimpleDateFormat sdf2 = new SimpleDateFormat("EEEE, dd MMMM
yyyy - hh:mm a", Locale.US);
item.pubdate = sdf2.format(mDate);
} catch (ParseException e) {
e.printStackTrace();
}
map.put(TAG_TITLE, item.title);
map.put(TAG_LINK, item.link);
map.put(TAG_DESCRIPTION, item.description);
map.put(TAG_PUB_DATE, item.pubdate); // If you want parse the
date
// adding HashList to ArrayList
rssItemList.add(map);
}
// updating UI from Background Thread
runOnUiThread(new Runnable() {
public void run() {
/* ListAdapter adapter = new SimpleAdapter( //Old code
RSSFeedActivity.this,
rssItemList, R.layout.rss_item_list_row,
new String[]{TAG_LINK, TAG_TITLE,
TAG_DESCRIPTION,TAG_PUB_DATE},
new int[]{R.id.page_url, R.id.title,
R.id.description, R.id.pub_date});
// updating listview
setListAdapter(adapter);*/
RecyclerView recyclerView = (RecyclerView)
findViewById(R.id.recyclerView);
// set a GridLayoutManager with default vertical orientation
and 2 number of columns
GridLayoutManager gridLayoutManager = new
GridLayoutManager(getApplicationContext(), 2);
recyclerView.setLayoutManager(gridLayoutManager); // set
LayoutManager to RecyclerView
// call the constructor of CustomAdapter to send the
reference and data to Adapter
CustomAdapter customAdapter = new
CustomAdapter(RSSFeedActivity.this, rssItemList, new String[]
{TAG_LINK, TAG_TITLE, TAG_DESCRIPTION,TAG_PUB_DATE});
recyclerView.setAdapter(customAdapter);
}
});
return null;
}
protected void onPostExecute(String args) {
pDialog.setVisibility(View.GONE);
}
}
}
自定义适配器类:
public class CustomAdapter extends
RecyclerView.Adapter<CustomAdapter.MyViewHolder> {
ArrayList rssItemList;
Context context;
public CustomAdapter(Context context, ArrayList rssItemList,String[]
from) {
this.context = context;
this.rssItemList = rssItemList;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int
viewType) {
// infalte the item Layout
View v =
LayoutInflater.from(parent.getContext()).inflate(R.layout.gridview_row,
parent, false);
// set the view's size, margins, paddings and layout parameters
MyViewHolder vh = new MyViewHolder(v); // pass the view to View
Holder
return vh;
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position)
{
holder.name.setText(rssItemList.get(position)); //Showing error
holder.image.setText(rssItemList.get(position)); //Showing error
}
@Override
public int getItemCount() {
return rssItemList.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
// init the item view's
TextView name;
TextView image;
public MyViewHolder(View itemView) {
super(itemView);
// get the reference of item view's
name = (TextView)
itemView.findViewById(R.id.android_gridview_text1);
image = (TextView)
itemView.findViewById(R.id.android_gridview_text2);
}
}
}
不,我面临一个问题。无法将数据传递给自定义适配器。请帮我解决这个问题。
解决方案
推荐阅读
- c++ - #define 宏用于不同上下文的“静态”
- authentication - 来自 F5 的 iv-user 的 Websphere Liberty 身份验证
- java - 如何在没有 JAVA / JRE 的情况下运行基于 Java 的 .app
- spring - Open API 代码生成器 Maven 插件使用旧的 Swagger 2 注释而不是 Swagger 3 注释
- python - 如何对函数进行分组,然后在 Pandas 中使用函数进行过滤
- spring-boot - JpaRepository 合并()方法
- javascript - 'import("cesium").BoundingSphere' 类型中缺少属性 'intersect' 但类型中需要
- reactjs - 如何在 React 中制作延迟加载高阶组件
- reactjs - 如何让我的按钮在不同的移动设备上响应?
- haskell - 解析json时构造GADT