【发布时间】:2016-05-12 07:10:19
【问题描述】:
在这一行:ListItemsModel listItem = getItem(position); 在我的适配器类中,我得到了转换错误。
非常奇怪的错误,考虑到我根本没有将String 投射到我的ListItemsModel 对象上。事实上,这段代码工作得很好,然后我更新了我的启动器图标(不相关),现在我得到了这个错误。有任何想法吗?谢谢。
MainListActivity
package org.azurespot.nonigrocerylist;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
public class MainListActivity extends AppCompatActivity {
private ArrayList<ListItemsModel> itemsList = new ArrayList<>();
private ListViewItemAdapter itemsAdapter;
private ListView itemsView;
EditText newItemET;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_list);
newItemET = (EditText)findViewById(R.id.etNewItem);
// read items that were persisted in list, before adapter is created with the list
readItems();
itemsAdapter = new ListViewItemAdapter(MainListActivity.this, itemsList);
itemsView = (ListView) findViewById(R.id.lvItems);
itemsView.setAdapter(itemsAdapter);
setUpListDetailsClickListener();
setupDeleteItemClickListener();
}
// Enables a listener, to go to list details activity
public void setUpListDetailsClickListener(){
itemsView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
if (itemsView.getItemAtPosition(position) != null) {
Intent intent = new Intent(MainListActivity.this, ListItemActivity.class);
intent.putExtra("item name", itemsView.getItemAtPosition(position).toString());
startActivity(intent);
} else {
Toast.makeText(MainListActivity.this, "Add item to list.",
Toast.LENGTH_SHORT).show();
}
}
});
}
// Adds item to list
public void addItem(View v) {
if (!newItemET.getText().toString().equals("")) {
ListItemsModel item = new ListItemsModel(newItemET.getText().toString(), 1);
itemsAdapter.add(item);
newItemET.setText("");
writeItems();
}
// soft keyboard down
InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.hideSoftInputFromWindow(newItemET.getWindowToken(), 0);
}
// Enables listener to delete item
private void setupDeleteItemClickListener() {
itemsView.setOnItemLongClickListener(
new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapter,
View item, int pos, long id) {
// Remove the item within array at position
itemsList.remove(pos);
// Refresh the adapter
itemsAdapter.notifyDataSetChanged();
writeItems();
// Return true consumes the long click event (marks it handled)
return true;
}
});
}
// Reads list from file (saved)
private void readItems() {
File filesDir = getFilesDir();
File groceryFile = new File(filesDir, "grocery.txt");
try {
itemsList = new ArrayList<ListItemsModel>(FileUtils.readLines(groceryFile));
} catch (IOException e) {
e.printStackTrace();
}
}
// Writes new items to list (saves it), or refreshes after delete item
private void writeItems() {
File filesDir = getFilesDir();
File groceryFile = new File(filesDir, "grocery.txt");
try {
FileUtils.writeLines(groceryFile, itemsList);
} catch (IOException e) {
e.printStackTrace();
}
}
}
ListViewItemAdapter
package org.azurespot.nonigrocerylist;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.EditText;
import java.util.ArrayList;
/**
* Created by mizu on 5/11/16.
*/
public class ListViewItemAdapter extends ArrayAdapter<ListItemsModel> {
public ListViewItemAdapter(Context context, ArrayList<ListItemsModel> items){
super(context, 0, items);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ViewHolder holder;
ListItemsModel listItem = getItem(position);
if(row == null) {
row = LayoutInflater.from(getContext())
.inflate(R.layout.list_row, parent, false);
holder = new ViewHolder();
holder.checkBox = (CheckBox)row.findViewById(R.id.checkBox);
holder.itemTitleET = (EditText)row.findViewById(R.id.listItem);
holder.itemQtyET = (EditText)row.findViewById(R.id.itemQty);
row.setTag(holder);
}
else {
holder = (ViewHolder)row.getTag();
}
holder.itemTitleET.setText(listItem.getTitle());
// setText() only accepts Strings
holder.itemQtyET.setText(String.valueOf(listItem.getQty()));
return row;
}
static class ViewHolder {
CheckBox checkBox;
EditText itemTitleET;
EditText itemQtyET;
}
}
ListItemsModel
package org.azurespot.nonigrocerylist;
/**
* Created by mizu on 5/11/16.
*/
public class ListItemsModel {
private String title;
private int qty = 0;
public ListItemsModel(String t, int q){
this.title = t;
this.qty = q;
}
public ListItemsModel(String t){
this.title = t;
}
public String getTitle(){
return title;
}
public void setTitle(String title){
this.title = title;
}
public int getQty(){
return qty;
}
public void setQty(int qty){
this.qty = qty;
}
}
LogCat
05-12 00:03:30.972 28958-28958/org.azurespot.nonigrocerylist E/AndroidRuntime: FATAL EXCEPTION: main
Process: org.azurespot.nonigrocerylist, PID: 28958
java.lang.ClassCastException: java.lang.String cannot be cast to org.azurespot.nonigrocerylist.ListItemsModel
at org.azurespot.nonigrocerylist.ListViewItemAdapter.getView(ListViewItemAdapter.java:29)
at android.widget.AbsListView.obtainView(AbsListView.java:2842)
at android.widget.ListView.measureHeightOfChildren(ListView.java:1290)
at android.widget.ListView.onMeasure(ListView.java:1202)
at android.view.View.measure(View.java:18425)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:728)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:464)
at android.view.View.measure(View.java:18425)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5802)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135)
at android.view.View.measure(View.java:18425)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5802)
at android.support.v7.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:391)
at android.view.View.measure(View.java:18425)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5802)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
at android.view.View.measure(View.java:18425)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5802)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1835)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:725)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:616)
at android.view.View.measure(View.java:18425)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5802)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2881)
at android.view.View.measure(View.java:18425)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2241)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1295)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1537)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1180)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6563)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:777)
at android.view.Choreographer.doCallbacks(Choreographer.java:590)
at android.view.Choreographer.doFrame(Choreographer.java:560)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:763)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5835)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
【问题讨论】:
-
你在哪一行遇到异常?
-
我在顶部提到它......它在适配器类中,当我尝试在以下位置获取项目时:
ListItemsModel listItem = getItem(position); -
你应该用ListItemsModel listItem = (ListItemsModel)getItem(position);来改变它。因为 getItem() 方法返回的是对象而你没有指定它。
-
我试过这个,但我的编译器说它是多余的,我仍然得到错误。
-
然后覆盖适配器类中的 getItem() 方法并将其更改为与您的模型类。
标签: android listview arraylist android-arrayadapter