2015-06-08 3 views
-2

Я наконец-то реализовал расширенный ArrayAdapter, и все работает правильно, другое, что тот факт, что первый элемент, добавленный в список, отображается без текста в текстовом представлении. Интересно, что, хотя достаточно было добавлено достаточно, чтобы список был достаточно длинным, чтобы прокручивать строку «без текста» с экрана, а затем снова включаться, то теперь он корректно показывает текст. Учитывая, что они также показывают тост, чтобы убедиться, что то, что мне нужно отобразить, на самом деле есть. то я думаю, что проблема действительно связана с тем, как выглядит список, а не с какой-то программной ошибкой в ​​том, как создается список в первую очередь. Я новичок в этом и полностью готов признать любые ошибки, которые я, возможно, сделал. Единственный вопрос, который я мог найти, это todo с компоновкой элемента listview, который является линейным, а не относительным расположением, поэтому я изменил его, и он сделал то же самое. Мой код ниже, извините его долго, но я не знал, какие биты могут быть исключены, так что у вас есть все. Я признателен за любую помощь на всех здесь :)Android: Пустое текстовое представление для первого элемента в виде списка

package com.bitcrazy.gez.electricitycost; 

    import android.content.Context; 
    import android.content.Intent; 
    import android.support.v7.app.ActionBarActivity; 
    import android.os.Bundle; 
    import android.view.LayoutInflater; 
    import android.view.Menu; 
    import android.view.MenuItem; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.AdapterView; 
    import android.widget.ArrayAdapter; 
    import android.widget.Button; 
    import android.widget.ImageButton; 
    import android.widget.ImageView; 
    import android.widget.ListView; 
    import android.widget.TextView; 
    import android.widget.Toast; 

    import com.google.android.gms.ads.AdRequest; 
    import com.google.android.gms.ads.AdView; 

    import java.util.ArrayList; 
    import java.util.List; 


    public class HouseholdViewer extends ActionBarActivity { 
     public Household house = new Household(); 
     ApplianceListAdapter ala = null; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) 
     { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_household_viewer); 
      AdView mAdView = (AdView) findViewById(R.id.adViewHousehold); 
      AdRequest adRequest = new AdRequest.Builder().build(); 
      mAdView.loadAd(adRequest); 
      ala = new ApplianceListAdapter(
      this, R.layout.app_list_item, house.getApplianceDescs()); 
    ala.notifyDataSetChanged(); 
    ListView lv = (ListView) findViewById(R.id.listView_appliancesList); 

    lv.setAdapter(ala); 
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Toast.makeText(getApplicationContext(), 
        "Appliance was clicked at " + position, Toast.LENGTH_LONG).show(); 
     } 
    }); 
    Button addAppliance = (Button) findViewById(R.id.button_AddAppliance); 
    addAppliance.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) 
     { 
      Intent gotoAddAppliance = new Intent(v.getContext(), AddAppliance.class); 
      startActivityForResult(gotoAddAppliance, 1); 
     } 
    }); 
} 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if (requestCode == 1) { 
     if (resultCode == RESULT_OK) { 
      Appliance a = data.getParcelableExtra("newAppliance"); 
      a.setCost(a.getCost(house.getElectricityCostPerKwh())/100); 
      a.scaleCost(house.getAtts().getDaysInMonth()); 
      house.addAppliance(a); 
      Toast.makeText(getApplicationContext(), 
        "new Appliance " + a.toString(), 
        Toast.LENGTH_LONG).show(); 
     } 
    } 
    ala.notifyDataSetChanged(); 
} 

     @Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_household_viewer, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 
    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

private class ApplianceListAdapter extends ArrayAdapter<String> 
{ 
    private int layout; 
    public ApplianceListAdapter(Context context, int resource, List<String> objects) 
    { 
     super(context, resource, objects); 
     layout = resource; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     final int pos = position; 
     Viewholder holder; 
     if(convertView == null) 
     { 

      LayoutInflater inflater = LayoutInflater.from(getContext()); 
      convertView = inflater.inflate(layout, parent, false); 

      holder = new Viewholder(); 

      holder.thumbnail = (ImageView) convertView.findViewById(
        R.id.imageView_applianceIcon); 
      holder.description = (TextView) convertView.findViewById(
        R.id.textView_ApplianceTextDesc); 
      holder.edit = (Button) convertView.findViewById(
        R.id.button_edit); 
      holder.deleteButton = (ImageButton) convertView.findViewById(
        R.id.imageButton_removeAppliance); 
     } 
     else { 
      holder = (Viewholder) convertView.getTag(); 
      holder.description.setText(getItem(pos)); 
     } 
     holder.deleteButton.setOnClickListener(new AdapterView.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(getContext(), "Delete was clicked for List Item " 
         + pos,Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     holder.edit.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(getContext(), "Edit was clicked for Appliance " 
         + pos, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     convertView.setTag(holder); 
     return convertView; 
    } 
} 

private class Viewholder 
{ 
    ImageView thumbnail; 
    TextView description; 
    Button edit; 
    ImageButton deleteButton; 
} 

}

+0

сократить до погони, описать вам проблемы в ясной и краткой форме. –

+0

извините. первый элемент, который я добавляю в свой список (начинается с пустого при первом показе), не отображает текст в части textview. ive подтвердил, что он существует, но его не показывают. каждый другой элемент, который я добавляю, в порядке. – gezinspace

+0

какой части не отображается? –

ответ

1

Переместить следующую строку вне еще условия

holder.description.setText(getItem(pos)); 

Причина: Вы добавляете условие

if(convertView == null){ 
}else{ 
} 

Вы устанавливаете свой текст только внутри else conditio п. Поэтому, когда он входит в условие if, строка пуста.

Примечание:

Всякий раз, когда вы добавляете элементы в ListView просто рассмотреть, если и еще часть. Это самая распространенная проблема.

+0

Ах, спасибо, столько Амшир. Это сработало сразу! Сейчас это кажется довольно очевидным. Я пытался сортировать эту проблему в течение нескольких часов, теперь я могу спать счастливо: D – gezinspace

+0

Wow это работает? Тогда примите ответ :) – Amsheer

0

Внести следующие изменения в адаптере ApplianceListAdapter:

if(){ 

// your code 

}else{ 
holder = (Viewholder) convertView.getTag(); 
} 

holder.description.setText(getItem(pos)); 

указан текст описания после, если еще блок. Надеюсь, что это сработает.

1

Ваш код:

else { 
      holder = (Viewholder) convertView.getTag(); 
      holder.description.setText(getItem(pos)); 
     } 

Изменить это в:

else { 
      holder = (Viewholder) convertView.getTag(); 

     } 

holder.description.setText(getItem(pos)); 
Смежные вопросы