我正在將我的活動更改爲我的一個應用程序的片段,並且遇到下面的錯誤。沒有跡象表明錯誤是什麼導致了錯誤,但是我縮小到了下面的片段。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
感謝您的回覆,我仍然不清楚如何解決這個問題,我應該使用公共ArrayAdapter並將其傳遞到該列表中,然後將其設置爲列表視圖? – JJSmith
將數據設置到適配器和適配器到ListView。您可能想要爲第三個參數使用R.id.ingredientName。 – Tomik
並考慮接受(並upvoting)的答案,如果它幫助你;) – Tomik