【问题标题】:Unable to parse Xml data to RecyclerView无法将 Xml 数据解析到 RecyclerView
【发布时间】:2019-05-14 15:50:35
【问题描述】:

我有一个 RecyclerView,它应该从 XML 文件中获取数据。我创建了一个方法,该方法从包含 XML 内容的变量中获取输入文件,然后循环此数据并将 XML(子节点)添加到列表中(例如:ArrayList nameoftheList)。该列表用于要显示的onBind方法中。

我的问题是运行回收器的应用程序什么也没显示! 下面是一些代码:

编辑:进行了建议的更改


适配器(编辑)

public class Adapter_recycler extends   
RecyclerView.Adapter<RecyclerView.ViewHolder> 
{


private String lista;
private ArrayList<Node> listaNodi;
private ArrayList<String> lista_errore;

public Adapter_recycler(String lista,RecyclerView recyclerView) {
    this.lista = lista;
    listaNodi = new ArrayList<>();


    lista_errore = new ArrayList<>();
    for (int i=0;i<=5;i++)
    lista_errore.add("ERRORE");

    try {
        LeggiFile();
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (SAXException e) {
        e.printStackTrace();
    }

}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v;
            v = LayoutInflater.from(parent.getContext()).inflate(R.layout.righe_main,parent,false);
            return new ViewHolder1(v);
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {


    if(listaNodi.size() == 0)
    {
        ((ViewHolder1)viewHolder).titolo1.setText(lista_errore.get(position));
    }else{
        ((ViewHolder1)viewHolder).titolo1.setText(((Element) listaNodi.get(position)).getAttribute("name"));
    }

}

@Override
public int getItemCount() {
   if (listaNodi.size() == 0)
    return lista_errore.size();
   else
       return  listaNodi.size();
}

XML 方法(循环并添加到列表中)(编辑)

private void LeggiFile() throws ParserConfigurationException, IOException, SAXException {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder DBuilder = factory.newDocumentBuilder();

    Node Players = DBuilder.parse(new InputSource(new StringReader(lista)));
    Node player = null;

    for (int i = 0; i < Players.getChildNodes().getLength(); i++) {
        if (player == null) {
            player = Players.getFirstChild();
        }
        else
            {player  = player.getNextSibling() ;}
        listaNodi.add(player);
    }

}

片段(编辑)

public class Fragment_Chat extends Fragment {

private Adapter_recycler adapter;
private RecyclerView recyclerView;
private LinearLayoutManager linearLayoutManager;
private String list = "";
Context context = getActivity();


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_fragment__chat, container,  
false);


    list = ("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
            "<Players>\n" +
            "<player name=\"mike\">\n" +
            "</player>\n" +
            "<player name=\"mike\">\n" +
            "</player>\n" +
            "<player name=\"mike\">\n" +
            "</player>\n" +
            "</Players>");


    recyclerView = view.findViewById(R.id.recycler);
    linearLayoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(linearLayoutManager);
    adapter = new Adapter_recycler(list,recyclerView,context);

    recyclerView.setAdapter(adapter);


    return view;

}

}

【问题讨论】:

  • File() 的构造函数接受一个路径名 - 你已经给它一个 XML 字符串
  • 所以你检查了文件是否存在,file#exists 返回 true?

标签: java android xml android-recyclerview


【解决方案1】:

我马上就能看到变化

@Override
public int getItemCount() {
   return 0;
}

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

Adapter_recycler 构造函数未实例化字段listaNodi

如果这不能解决问题,您可以在 onBindViewHolder 中放置一个断点,并确保 listaNodi 有项目。

移动

    try {
            LeggiFile();
..
..

Adapter_recycler构造函数,否则每次需要视图时都会运行

DBuilder.parse可以带String,不需要File

【讨论】:

  • 已更改但应用程序崩溃:(
  • @Mike-OS 检查 logcat 的堆栈跟踪并从那里开始工作。
  • LogCat 准确显示代码中的哪一行有问题
  • 那是因为 listaNodi 没有像 private List&lt;Node&gt; listaNodi = new List; 那样实例化最好你在 Adapter_recycler 构造函数中这样做,或者在使用它之前延迟
  • LeggiFile()调用移动到Adapter_recycler构造函数,否则每次需要视图时都会运行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 2021-11-04
  • 2021-04-15
  • 2016-04-07
  • 1970-01-01
  • 2021-04-27
相关资源
最近更新 更多