首页 > 解决方案 > 如何在自定义 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);
         }
        }

   }

不,我面临一个问题。无法将数据传递给自定义适配器。请帮我解决这个问题。

标签: androidgridviewandroid-listviewgridandroid-gridview

解决方案


推荐阅读