【问题标题】:Why doesn't my for loop pass values?为什么我的 for 循环不传递值?
【发布时间】:2015-07-31 19:10:15
【问题描述】:

我创建了一个方法来循环一个包含 4 个项目的文件并生成类 obj 资源模板如下:

<?xml version="1.0" encoding="UTF-8"?>
<part1prayer>   
    <item> 
         <title> </title>
         <arabictext> </arabictext>
         <transliteration> </transliteration>
         <tanslanguage> </tanslanguage>
         <translation> </translation>
    </item>
</part1prayer>

由于某种原因,此方法会四次返回最后一个 Item item[3],而不是 item[0]item[1]item[2]

但是,如果我在这一行 nNode = nList.item(temp); 手动传递值,即用 2 替换 temp,它将返回项目 2 四次。

public ArrayList<PrayerDataProperties> readAssetFile2(String fileName) {

  ArrayList<PrayerDataProperties> listOfPrayers = null;

  try {
    listOfPrayers = new ArrayList<>();
    InputStream inputstream = null;
    Node nNode = null;

    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    inputstream = context.getAssets().open(fileName);
    Document doc = dBuilder.parse(inputstream);

    doc.getDocumentElement().normalize();

    NodeList nList = doc.getElementsByTagName(ITEM);

    for (int temp = 0; temp < nList.getLength(); temp++) {
      nNode = nList.item(temp);

      if (nNode.getNodeType() == Node.ELEMENT_NODE) {

        Element eElement = (Element) nNode;
        PrayerDataProperties prayerData = new PrayerDataProperties();
        prayerData.setArabicTxt(eElement.getElementsByTagName(ARABIC_TEXT)
            .item(0).getTextContent());
        prayerData.setTransliterationTxt(eElement
            .getElementsByTagName(TRANSLITERATION).item(0).getTextContent());
        prayerData.setTransLangTxt(eElement
            .getElementsByTagName(TRANS_LANGUAGE).item(0).getTextContent());
        prayerData.setTranslationTxt(eElement
            .getElementsByTagName(TRANSLATION).item(0).getTextContent());

        listOfPrayers.add(prayerData);
      }// End if

    }// End for

  }// End try

  catch (Exception e) {
    e.printStackTrace();
  }// End catch

  return listOfPrayers;

}// End of readAssetFile2

public class PrayerListCustomAdapter extends BaseAdapter
{
private Context context;
private ArrayList<PrayerDataProperties> listsOfPrayer;
LayoutInflater layoutInflater;
private PrayerDataProperties prayerDataProperties;

// Empty Constructor
public PrayerListCustomAdapter()
{

}// End Empty Constructor

public PrayerListCustomAdapter(Context acontext,             ArrayList<PrayerDataProperties> prayerLists)
{
    this.context = acontext;
    this.listsOfPrayer = prayerLists;
    layoutInflater = LayoutInflater.from(acontext);

}//End of Constructor

@Override
public int getCount() {
    return listsOfPrayer.size();
}

@Override
public Object getItem(int position) {
    return listsOfPrayer.get(position);
}

@Override
public long getItemId(int position)
{
    return listsOfPrayer.indexOf(position);
}


@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    ViewHolder holder = null;
    View customView = convertView;
    // Inflate the View if Empty
    if (customView == null)
    {
        customView = layoutInflater.inflate(R.layout.prayer_list_template,        null);
        // Attach View to View inflated and ViewGroup
        holder = new ViewHolder();
        // Instantiate Views
        holder.arabicTxt =   (TextView)customView.findViewById(R.id.tv_arabic_txt);
        holder.transliterationTxt = (TextView)customView.findViewById(R.id.tv_transliteration_txt);
        holder.transLanguageTxt = (TextView)customView.findViewById(R.id.tv_translang_txt);
        holder.translationTxt = (TextView)customView.findViewById(R.id.tv_translation_txt);

        customView.setTag(holder);

    }//End if
    else
    {
        // Call The View already Inflated
        holder = (ViewHolder)customView.getTag();
    }//End else

    // Pass Data to Each View
    prayerDataProperties = (PrayerDataProperties)getItem(position);

    holder.arabicTxt.setText(prayerDataProperties.getArabicTxt());
      holder.transliterationTxt.setText(prayerDataProperties.getTransliterationTxt());
    holder.transLanguageTxt.setText(prayerDataProperties.getTransLangTxt());
    holder.translationTxt.setText(prayerDataProperties.getTranslationTxt());

    return customView;
}//End of getView

static class ViewHolder
{
    TextView arabicTxt, transliterationTxt, translationTxt,     transLanguageTxt;
}

}// End of PrayerListCustomAdapter

【问题讨论】:

  • 无意显示项目模板。
  • 它添加了四次 item[3]。对不起,伙计们,我是新来的。
  • @Want2bExpert 欢迎来到 Stack Overflow!我了解您是新人,但在这里我们更喜欢人们edit 他们的问题,而不是在 cmets 中回复他们的更新和澄清。请现在就这样做。
  • @durron597 我很高兴加入专家社区以进行改进。我已按要求编辑感谢您的支持伙计们
  • 有没有可能nList的长度大于4?如果是这样,您可能正在写入正确的数据,然后用最后一条数据重复写入它。确保 nList 没有会增加长度并破坏 for 循环的空节点。

标签: java android xml for-loop


【解决方案1】:

请确保PrayerDataProperties 中的字段不是静态的。如果是,那么所有实例都将具有相同的值,并且当您在 XML 中读取时它们会被覆盖。

如果这些字段确实有 static 关键字,请将它们删除,它应该可以解决您的问题。

【讨论】:

  • 我如何错过了对动态变量的静态影响背后的逻辑,这令人惊讶。几乎要打破我的手机了!!谢谢。我已将其标记为已回答。
猜你喜欢
  • 2018-10-11
  • 1970-01-01
  • 2019-08-20
  • 2020-11-26
  • 2013-03-23
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多