2016-02-26 93 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> 

行佈局

<?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,第二個參數預計的佈局資源ID,但沒有任何資源:

當 實例化視圖時,包含TextView的佈局文件的資源ID。

但您的行佈局是LinearLayout

如果您使用更復雜的佈局,使用另一種構造:

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

你可以用它來指定在佈局中TextView第三個參數。

+0

感謝您的回覆,我仍然不清楚如何解決這個問題,我應該使用公共ArrayAdapter並將其傳遞到該列表中,然後將其設置爲列表視圖? – JJSmith

+0

將數據設置到適配器和適配器到ListView。您可能想要爲第三個參數使用R.id.ingredientName。 – Tomik

+0

並考慮接受(並upvoting)的答案,如果它幫助你;) – Tomik

0

在代碼行

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

佈局「shopping_list_row」是指具有的LinearLayout但陣列適配器需要TextView的,所以你需要設置誰的父母是一個TextView或者可以創建自定義列自定義適配器佈局。

相關問題