2016-02-22 4 views
1


Я хочу использовать TextView внутри двухсторонней сетки https://github.com/jess-anders/two-way-gridview. Я могу успешно использовать ArrayAdapter с двухсторонней сеткой. Он работает правильно, как я хочу. Но когда я приспосабливаю пример от How to add a TextView to a GridView in Android.
Я получил NullPointerException при доступе к TextView.
Вот мой код.
MainActivity.java:
Доступ к TextView внутри twoway-gridView

public class MainActivity extends AppCompatActivity { 
    static final String[] numbers = new String[] { 
      "A", "B", "C", "D", "E", 
      "F", "G", "H", "I", "J", 
      "K", "L", "M", "N", "O", 
      "P", "Q", "R", "S", "T", 
      "U", "V", "W", "X", "Y", "Z"}; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     TwoWayGridView gridview = (TwoWayGridView) findViewById(R.id.gridview); 
     gridview = (TwoWayGridView) findViewById(R.id.gridview); 
//  ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
//    android.R.layout.simple_list_item_1, numbers); 
     TextViewAdapter adapter = (TextViewAdapter) new TextViewAdapter(this, numbers); 
     gridview.setAdapter(adapter); 

    } 

} 

layout.xml:

<?xml version="1.0" encoding="utf-8"?> 
<com.jaikra.sarit.wecare.TwoWayGridView.TwoWayGridView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/gridView1" 
    android:numColumns="auto_fit" 
    android:gravity="center" 
    android:columnWidth="100dp" 
    android:stretchMode="columnWidth" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

</com.jaikra.sarit.wecare.TwoWayGridView.TwoWayGridView> 

item.xml:

<TextView 
    android:id="@+id/grid_item_label" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@+id/label" 
    android:layout_marginTop="5px" 
    android:textSize="15px" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
</TextView> 

TextViewAdapter.java:

public class TextViewAdapter extends BaseAdapter { 
    private Context context; 
    private final String[] textViewValues; 

    public TextViewAdapter(Context context, String[] textViewValues) { 
     this.context = context; 
     this.textViewValues = textViewValues; 
    } 

    @Override 
    public int getCount() { 
     return textViewValues.length; 
    } 

    @Override 
    public Object getItem(int position) { 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     View gridView; 

     if (convertView == null) { 

      gridView = new View(context); 

      gridView = inflater.inflate(R.layout.layout, null); 

      // set value into textview 
      TextView textView = (TextView) gridView 
        .findViewById(R.id.grid_item_label); 
      textView.setText(this.textViewValues[position]); 

      textView.setTextColor(Color.GREEN); 

     } else { 
      gridView = (View) convertView; 
     } 

     return gridView; 
    } 
} 

Проблема:

FATAL EXCEPTION: main java.lang.NullPointerException at com.jaikra.sarit.wecare.TextViewAdapter.getView(TextViewAdapter.java:54) 

Ошибка:
Вот линии 54 и 55.

TextView textView = (TextView) gridView 
      .findViewById(R.id.grid_item_label); 
    textView.setText(this.textViewValues[position]); 

Вопрос: Как исправить эту проблему?
Какую тему программирования мне нужно прочитать?

После нескольких attemp:
Я начал верить TwoWay-GridView имеет somethinkg за занавесом, который не идентичен обычному GridView. Я открыл вопрос оригинальному разработчику, но любые приветствия здесь приветствуются.

+0

, что линия 54 ??? –

+0

Я просто добавлю его. Спасибо за Ваше внимание. – Sarit

ответ

1

Для пункта от GridView вы должны inflate

View view = inflater.inflate(R.layout.item, null); 
TextView textView= (TextView)view.findViewById(R.id.label); 
textView.setText(this.textViewValues[position]); 
textView.setTextColor(Color.GREEN); 

Надеюсь, это поможет.

ОБНОВЛЕНИЕ

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     View gridView; 

     if (convertView == null) { 
      gridView = inflater.inflate(R.layout.item, null); 

      // set value into textview 
      TextView textView = (TextView) gridView.findViewById(R.id.label); 
      textView.setText(this.textViewValues[position]); 

      textView.setTextColor(Color.GREEN); 

     } else { 
      gridView = (View) convertView; 
     } 

     return gridView; 
    } 
+0

До: gridView = новый вид (контекст); После: (удалить) gridView = новый вид (контекст); Ошибка все еще остается. Спасибо за внимание. – Sarit

+0

см. Обновленный код –

+0

Благодарим за помощь. Я читаю об этом пару дней :) – Sarit

0

Не устанавливайте GridView в новый экземпляр, изменить это:

GridView = convertView;

Затем раздуйте его.

EDITED

В моем адаптере я использую ViewHolders, это то, что я хотел бы сделать:

public View getView(int position, View convertView, ViewGroup parent) { 

    ViewHolder holder; 
    View vi = convertView; 

    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     vi = inflater.inflate(R.layout.layout, null); 

     holder = new ViewHolder(); 
     holder.textView = (TextView) vi.findViewById(R.id.grid_item_label); 

     vi.setTag(holder); 

    } else { 
     holder = (ViewHolder)vi.getTag(); 
    } 

    textView.setText(this.textViewValues[position]); 

    textView.setTextColor(Color.GREEN); 

    return vi; 

} 

Не забудьте добавить:

public static class ViewHolder{ 

    public TextView textView; 

} 
+0

До: gridView = новый вид (контекст); После gridView = convertView; У меня такая же ошибка. – Sarit

+0

Обновлен мой ответ. – ChonBonStudios

+0

До: public View getView() {...}. После: ваш ответ с держателем. infront из textView.setText() и textView.setTextColor(), поскольку он выходит из области видимости. Ошибка - это NullPointerException, как то же самое, но изменение в строке holder.textView.setText (this.textViewValues ​​[position]); – Sarit

Смежные вопросы