Отображение списка элементов в recyclerView не удалось - PullRequest
0 голосов
/ 29 июня 2019

Я пытаюсь сделать новостное приложение, данные получены из RSS-канала.Я получаю XML-ответ от канала.И я использую XmlPullParser для разбора XML.Разбор успешен.Я могу видеть значения в моем журнале.

Но почему-то я не могу заполнить их в своем обзоре.Это все просто пусто.Мой класс Java:

public class RssNewsActivity extends AppCompatActivity {
private static final String TAG = RssNewsActivity.class.toString();

RssFeedAdapter adapter;
RecyclerView recyclerView_rssFeed;
SwipeRefreshLayout swipeRefreshLayout;

private List<RssModel> listResponseModel;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_rss_news);

    initialize();

    recyclerView_rssFeed.setHasFixedSize(true);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    recyclerView_rssFeed.setLayoutManager(linearLayoutManager);

    adapter = new RssFeedAdapter(RssNewsActivity.this, listResponseModel);
    recyclerView_rssFeed.setAdapter(adapter);

    fetchNewsFeed();

    //if user swipes the recycler then refresh content page
    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            fetchNewsFeed();
        }
    });
}

private void initialize() {
    swipeRefreshLayout = findViewById(R.id.swipeRefresh_rssFeed);
    recyclerView_rssFeed = findViewById(R.id.recyclerView_rssFeed);

    listResponseModel = new ArrayList<>();
}

private void fetchNewsFeed() {
    String url = "here is my news feed url";
    StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            listResponseModel.clear();
            try {
                listResponseModel = parseNewsFeed(response);
            } catch (XmlPullParserException | IOException e) {
                Log.e(TAG, e.getMessage());
            }
            adapter.notifyDataSetChanged();
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });
    RequestQueue queue = Volley.newRequestQueue(this);
    queue.add(request);

}

private List<RssModel> parseNewsFeed(String response) throws XmlPullParserException,
        IOException {

    XmlPullParserFactory parserFactory = XmlPullParserFactory.newInstance();
    parserFactory.setNamespaceAware(true);
    XmlPullParser xmlPullParser = parserFactory.newPullParser();
    xmlPullParser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
    xmlPullParser.setInput(new StringReader(response));

    return processParsing(xmlPullParser);
}

private List<RssModel> processParsing(XmlPullParser xmlPullParser) throws IOException, XmlPullParserException {
    List<RssModel> listRssFeed = new ArrayList<>();
    int eventType = xmlPullParser.getEventType();
    RssModel rssModel = null;

    xmlPullParser.nextTag();
    while (eventType != XmlPullParser.END_DOCUMENT) {
        String eltName;
        switch (eventType) {
            case XmlPullParser.START_DOCUMENT:
                break;
            case XmlPullParser.START_TAG:
                eltName = xmlPullParser.getName();
                if ("item".equals(eltName)) {
                    rssModel = new RssModel();
                } else if (rssModel != null) {
                    if ("title".equals(eltName)) {
                        String title = xmlPullParser.nextText();
                        rssModel.setTitle(title);
                        Log.d(TAG, "title: " + title);
                    } else if ("link".equals(eltName)) {
                        String link = xmlPullParser.nextText();
                        rssModel.setLink(link);
                        Log.d(TAG, "link: " + link);
                    }
                }
                break;
            case XmlPullParser.END_TAG:
                eltName = xmlPullParser.getName();
                if ("item".equals(eltName) && rssModel != null) {
                    listRssFeed.add(rssModel);
                }
                break;
        }
        eventType = xmlPullParser.next();
    }
    return listRssFeed;
}
}

Мой дизайн XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="rssnewsfeed.RssNewsActivity">

<android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/swipeRefresh_rssFeed"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView_rssFeed"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</android.support.v4.widget.SwipeRefreshLayout>

</RelativeLayout>

Это мой класс адаптера

public class RssFeedAdapter extends RecyclerView.Adapter<RssFeedAdapter.RssViewHolder> {
private Context mContext;
private List<RssModel> mRssFeeds;

public RssFeedAdapter(Context mContext, List<RssModel> mRssFeeds) {
    this.mContext = mContext;
    this.mRssFeeds = mRssFeeds;
}

@NonNull
@Override
public RssViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(mContext).inflate(R.layout.rss_feed_layout, viewGroup, false);
    return new RssViewHolder(v);
}

@Override
public void onBindViewHolder(@NonNull RssViewHolder rssViewHolder, int i) {
    RssModel post = mRssFeeds.get(i);

    rssViewHolder.textView_title.setText(post.getTitle());
    rssViewHolder.textView_link.setText(post.getLink());
}

@Override
public int getItemCount() {
    return mRssFeeds.size();
}

public class RssViewHolder extends RecyclerView.ViewHolder {
    private TextView textView_title, textView_link;

    public RssViewHolder(@NonNull View itemView) {
        super(itemView);
        textView_title = itemView.findViewById(R.id.textView_title);
        textView_link = itemView.findViewById(R.id.textView_link);
    }

}
}

И, наконец, это мой класс модели:

public class RssModel {
private String title;
private String link;

public RssModel() {
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getLink() {
    return link;
}

public void setLink(String link) {
    this.link = link;
}
}

Я пробовал много способов, но безуспешно.Я не знаю, чего мне не хватает.Буду благодарен за любое руководство.Спасибо.

Ответы [ 2 ]

1 голос
/ 29 июня 2019

Это происходит потому, что список Rss, который вы передаете адаптеру представления переработчика, равен нулю. Как вы уже упоминали ранее, вы успешно получаете значения в журнале, поэтому другой гарантированный обходной путь - это установить значения в отдельный массив.

Так что внутри вашего класса просто создайте arraylist:

private ArrayList<String> title;

private ArrayList<String> post;

Это будет ваш метод инициализации:

private void initialize() 
{
       swipeRefreshLayout = findViewById(R.id.swipeRefresh_rssFeed);
       recyclerView_rssFeed = findViewById(R.id.recyclerView_rssFeed);

       title = new ArrayList<>();

       post = new ArrayList<>();

}

Теперь просто передайте ваши значения arraylist:

title.add(title)

post.add(post)

Теперь передайте эти массивы в адаптер:

adapter = new RssFeedAdapter(RssNewsActivity.this, title,post);
    recyclerView_rssFeed.setAdapter(adapter);

После этого инициализируйте arraylist в адаптере и извлеките ваши значения!

Еще одна важная вещь внутри вашего oncreate() поместите ваш метод fetchNewsFeed(); перед инициализацией адаптера

 initialize();
fetchNewsFeed();
  recyclerView_rssFeed.setHasFixedSize(true);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    recyclerView_rssFeed.setLayoutManager(linearLayoutManager);

    adapter = new RssFeedAdapter(RssNewsActivity.this, listResponseModel);
    recyclerView_rssFeed.setAdapter(adapter);
1 голос
/ 29 июня 2019

Предоставление "=" создаст новый экземпляр ArrayList, кроме которого уже привязан к RecyclerView адаптеру.

Итак, вам нужно изменить это,

listResponseModel = parseNewsFeed(response);

до

listResponseModel.addAll(parseNewsFeed(response));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...