2016-02-26 3 views
0

Я в процессе изменения своих действий в фрагменты для одного из моих приложений и столкнулся с приведенной ниже ошибкой. В ошибке не было указаний относительно того, что вызывало ошибку, но я сузил ее до нижнего фрагмента.Android ListFragment android.widget.LinearLayout не может быть передан в android.widget.TextView

Я также получаю еще одну странную ошибку, поскольку при добавлении элемента в список его флажок не может быть отмечен до тех пор, пока активность не будет оставлена ​​и снова введена повторно? Есть ли способ сделать флажок удаляемым, как только он будет добавлен в список, не покидая его и не вернется?

Может ли кто-нибудь объяснить мне эту ошибку?

Фрагмент

import android.app.Dialog; 
import android.support.v4.app.ListFragment; 
import android.content.Context; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.SimpleCursorAdapter; 
import android.widget.Spinner; 


public class ShoppingList extends ListFragment{ 

    private Cursor cursor; 
    private static int measurementValue; 
    private static String unitValue; 

    private String name; 
    private String unit; 
    private int measurement; 
    private int currMeasurement; 
    private int newMeasure; 


    public ShoppingList() { 
     // Required empty public constructor 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
    } 

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

     final DBMain db = new DBMain(getActivity()); 

     db.open(); 

     cursor = db.getAllItems(); 
     String[] values = new String[cursor.getCount()]; 
     cursor.moveToFirst(); 
     for(int i = 0; i < cursor.getCount(); i++) 
     { 
      String row = cursor.getString(cursor.getColumnIndex("name")); 
      values[i] = row; 
      cursor.moveToNext(); 
     } 

     ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), 
       R.layout.shopping_list_row, values); 
     setListAdapter(adapter); 

     FloatingActionButton filterButton = (FloatingActionButton) rootView.findViewById(R.id.addButton); 
     filterButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
      // custom ingredient_dialog 
      final Dialog dialog = new Dialog(getActivity()); 
      dialog.setContentView(R.layout.shopping_dialog); 
      dialog.setTitle("Add Item"); 

      final EditText item = (EditText) dialog.findViewById(R.id.item); 

      final Spinner measurement = (Spinner) dialog.findViewById(R.id.measurement); 
      measurement.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { 
       final String measurementValue = measurement.getSelectedItem().toString(); 
       int finalMeasurement = Integer.parseInt(measurementValue); 
       ShoppingList.measurementValue = finalMeasurement; 
       } 

       @Override 
       public void onNothingSelected(AdapterView<?> parentView) { 

       } 

       }); 

       final Spinner unit = (Spinner) dialog.findViewById(R.id.unit); 
       unit.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
       @Override 
       public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { 
        String finalUnit = unit.getSelectedItem().toString(); 
        unitValue = finalUnit; 
        } 

        @Override 
        public void onNothingSelected(AdapterView<?> parentView) { 
        } 

        }); 

        Button dialogButtonOk = (Button) dialog.findViewById(R.id.dialogButtonOK); 
        // if button is clicked, close the custom ingredient_dialog 
        dialogButtonOk.setOnClickListener(new View.OnClickListener() { 
                @Override 
                public void onClick(View v) { 
         String newItem = item.getText().toString(); 
         db.open(); 
         db.insertItem(newItem, measurementValue, unitValue); 
         Cursor cursor = db.getAllItems(); 

         //String[] columns = new String[] {db.KEY_NAME, db.KEY_CODE, db.KEY_ROWID}; 
         String[] columns = new String[]{db.KEY_ITEM_NAME, db.KEY_MEASUREMENT, db.KEY_UNIT}; 

         int[] to = new int[]{R.id.ingredientName, R.id.ingredientMeasurement, R.id.ingredientUnit}; 

         final SimpleCursorAdapter myCursorAdapter = new SimpleCursorAdapter(getActivity(), R.layout.shopping_list_row, cursor, columns, to, 0); 

         //final ListView shoppingList = (ListView) rootView.findViewById(R.id.shoppingList); 
         //shoppingList.setAdapter(myCursorAdapter); 
         setListAdapter(myCursorAdapter); 
         dialog.dismiss(); 
          } 
         }); 

         Button dialogButtonNext = (Button) dialog.findViewById(R.id.dialogButtonNext); 
         // if button is clicked, close the custom ingredient_dialog 
         dialogButtonNext.setOnClickListener(new View.OnClickListener() { 
                @Override 
                public void onClick(View v) { 
         String newItem = item.getText().toString(); 
         db.open(); 
         db.insertItem(newItem, measurementValue, unitValue); 
         item.setText(""); 
         Cursor cursor = db.getAllItems(); 

         //String[] columns = new String[] {db.KEY_NAME, db.KEY_CODE, db.KEY_ROWID}; 
         String[] columns = new String[]{db.KEY_ITEM_NAME, db.KEY_MEASUREMENT, db.KEY_UNIT}; 

         int[] to = new int[]{R.id.ingredientName, R.id.ingredientMeasurement, R.id.ingredientUnit}; 

         final SimpleCursorAdapter myCursorAdapter = new SimpleCursorAdapter(getActivity(), R.layout.shopping_list_row, cursor, columns, to, 0); 

         //final ListView shoppingList = (ListView) rootView.findViewById(R.id.shoppingList); 
         //shoppingList.setAdapter(myCursorAdapter); 
         setListAdapter(myCursorAdapter); 

                } 
               }); 
         dialog.show(); 
              } 
             } 

        ); 

     return rootView; 
    } 

    public class ShoppingCustomAdapter extends SimpleCursorAdapter implements CompoundButton.OnCheckedChangeListener { 

     private Context mContext; 
     private Context appContext; 
     private int layout; 
     private Cursor cr; 
     private final LayoutInflater inflater; 

     //private Context context = this; 
     //DBMain db = new DBMain(context); 


     public ShoppingCustomAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { 
      super(context, layout, c, from, to); 
      this.layout = layout; 
      this.mContext = context; 
      this.inflater = LayoutInflater.from(context); 
      this.cr = c; 
     } 

     @Override 
     public View newView(Context context, Cursor cursor, ViewGroup parent) { 
      return inflater.inflate(layout, null); 
     } 

     @Override 
     public void bindView(View view, Context context, Cursor cursor) { 
      super.bindView(view, context, cursor); 
      CheckBox checkBox1 = (CheckBox) view.findViewById(R.id.checkBox1); 
      checkBox1.setOnCheckedChangeListener(this); 
      int columnIndex = cursor.getColumnIndex("_id"); 
      int columnvalue = cursor.getInt(columnIndex); 
      checkBox1.setTag(columnvalue); 
     } 

     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      int id = (Integer) buttonView.getTag(); 


      final DBMain db = new DBMain(getActivity()); 

      db.open(); 

      //getting information about deleted item from the shopping list 
      Cursor item = db.getSingleItem(id); 
      item.moveToPosition(-1); 
      while(item.moveToNext()) 
      { 
       name = item.getString(item.getColumnIndex("name")); 
       measurement = item.getInt(item.getColumnIndex("measurement")); 
       unit = item.getString(item.getColumnIndex("unit")); 
      } 
      item.close(); 

      //check if item is in Kitchen 
      Cursor check = db.getSingleItem(id); 

      //if yes, update it 
      if(check!=null && check.getCount()>0) 
      { 
       //get current kitchen measurement 
       Cursor measure = db.getKitchenMeasurementID(id); 
       measure.moveToPosition(-1); 
       while(measure.moveToNext()) 
       { 
        currMeasurement = measure.getInt(measure.getColumnIndex("measurement")); 
       } 
       measure.close(); 
       newMeasure = measurement + currMeasurement; 

       db.updateContents(name, newMeasure); 
      } 
      else 
      { 

       db.insertContent(name, measurement, unit); 
      } 

      db.deleteItem(id); 
     } 
    } 

} 

XML фрагмента

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
> 

<ListView 
    android:id="@android:id/list" 
    android:layout_below="@+id/editText" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 
</ListView> 

<android.support.design.widget.FloatingActionButton 
    android:id="@+id/addButton" 
    app:backgroundTint="@color/floatingButton" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="bottom|right" 
    android:clickable="true" 
    android:src="@drawable/ic_tab_add" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentEnd="true" 
    android:layout_marginBottom="63dp" 
    android:layout_marginRight="16dp" /> 


</android.support.design.widget.CoordinatorLayout> 

Row Layout

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="horizontal" 
android:weightSum="1"> 

<TextView 
    android:id="@+id/ingredientName" 
    android:layout_width="wrap_content" 
    android:textColor="#000000" 
    android:layout_height="wrap_content" 
    android:padding="5dp" 
    android:hint="wewewe"/> 

<TextView 
    android:id="@+id/ingredientMeasurement" 
    android:textColor="#000000" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_toRightOf="@+id/ingredientName" 
    android:padding="5dp" 
    android:hint="fefefef"/> 

<TextView 
    android:id="@+id/ingredientUnit" 
    android:textColor="#000000" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_toRightOf="@+id/ingredientMeasurement" 
    android:padding="5dp" 
    android:hint="qqqqq"/> 


<CheckBox 
    android:id="@+id/checkBox1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="right" 
    android:background="#fff" 
    android:text=""/> 
</LinearLayout> 

Logcat Ошибка

Caused by: java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.TextView 

ответ

1

Вы используете ArrayAdapter неправильно, проблема, кажется, на этой линии:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), 
       R.layout.shopping_list_row, values); 

Проверить на documentation, то второй аргумент ожидает идентификатор компоновки ресурсов, но не какой-либо ресурс:

Идентификатор ресурса для файла макета, содержащего TextView для использования при создании .

Но ваш макет строки - это LinearLayout.

Если вы используете более сложную схему, используйте другой конструктор:

public ArrayAdapter (Context context, int resource, 
        int textViewResourceId, T[] objects) 

Вы можете использовать это третий аргумент, чтобы указать TextView в макете.

+0

Спасибо за ответ, я все еще не понимаю, как это исправить, следует ли использовать публичный ArrayAdapter и передавать в него вещи, а затем установить это в виде списка? – JJSmith

+0

Задайте данные адаптеру и адаптеру в ListView. Вероятно, вы захотите использовать R.id.ingredientName для третьего аргумента. – Tomik

+0

И подумайте о том, чтобы принять (и отложить) ответ, если он вам помог;) – Tomik

0

В Коде линии

ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), 
       R.layout.shopping_list_row, values); 
     setListAdapter(adapter); 

расположения «shopping_list_row» оказывает LinearLayout но адаптер массива занимает TextView, так что вы должны установить макет, который родительский является TextView или как создать пользовательский адаптер с пользовательской строкой.

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